Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

TSQL pour l'expérience de filtre à partir de la plage multiselect

Vous avez d'abord besoin d'une table checkRanges

CREATE TABLE checkRanges
    ([checkID] int, [name] varchar(8), [low] int, [upper] int);

INSERT INTO checkRanges
    ([checkID], [name], [low], [upper])
VALUES
    (1, '0-3', 0, 2),
    (2, '3-6', 3, 5),
    (4, '6-9', 6, 8),
    (8, '9-12', 9, 11),
    (16, '12+', 12, 999)

Découvrez comment checkID sont puissance de 2 ?

Dans votre application, si l'utilisateur sélectionne 3-6 et 9-12 vous envoyez 2+8 = 10 à votre bd. Ce serait également formidable si vous créez votre case à cocher en utilisant les informations de la base de données.

Dans votre base de données, vous effectuez une comparaison au niveau du bit pour sélectionner les bonnes plages. Ensuite, effectuez l'entre avec chaque plage.

WITH ranges as (
    SELECT *
    FROM checkRanges
    where checkID & 10 > 0
)
SELECT *
FROM users u
inner join ranges r
   on u.Experience between r.low and r.upper

Voir tout ensemble Démo SQL Fiddle J'inclus plus d'utilisateurs. Vous n'avez qu'à changer la clause where checkID & 10 > 0 pour tester une autre combinaison.

REMARQUE :
Je mets à jour les gammes. Remplacez la valeur supérieure par value - 1 car between est inclusif et pourrait donner des résultats en double.

Si vous voulez utiliser l'ancienne version, vous devez remplacer le between dans la phrase jointe à

u.Experience >= r.low and u.Experience *<* r.upper