requête SQL - true => true, false => true ou false
-
20-08-2019 - |
Question
requête simple, peut-être impossible, mais je sais qu'il ya des gens intelligents là-bas:)
Etant donné un paramètre booléen, je souhaite définir ma clause where soit limiter la production d'une certaine colonne -. Ou ne rien faire
, paramètre donné @bit = 1 ce serait le résultat:
où la colonne = 1
paramètre donné @bit = 0 ce serait le résultat:
où la colonne = 1 ou 0
i.e.. ont aucun effet / afficher tous les résultats (colonne est un champ de bits)
Je ne suis pas vouloir sql dynamique -. Je peux se contenter de fixer dans votre code, mais je me demandais s'il y a quelque chose de magique intelligent qui ferait ce qui précède propre et simple
est-il? J'utilise le serveur SQL.
hourras: D
La solution
La réponse ne fonctionne que si la colonne column = 1 or @bit = 0
ne peut être 0 ou 1. Si la colonne peut être une valeur que vous voulez. column = 1 or @bit = 0 and column = 0
Autres conseils
SELECT *
FROM mytable
WHERE column = 1 OR @bit = 0
Si vous avez un index sur column1
, celui-ci sera plus efficace:
SELECT *
FROM mytable
WHERE column = 1 AND @bit = 1
UNION ALL
SELECT *
FROM mytable
WHERE @bit = 0
Voir cet article dans mon blog pour comparer les performances d'un rapport unique WHERE
état UNION ALL
:
where column BETWEEN @bit AND 1
select *
from MyTable
where (@bit = 0 OR MyColumn = 1)
select ...
from [table]
where @bit = 0 or (column = @bit)
J'étais venu avec une réponse différente et se sentait stupide en voyant la réponse de consensus. Donc, juste pour yucks, comparé les deux en utilisant ma propre base de données. Je ne sais pas vraiment si elles sont vraiment comparables, mais mes plans d'exécution donne un léger avantage à ma réponse loufoque:
select *
de MyTable
où la colonne <> @bit cas où 1 puis 0 -1 autre extrémité
Je me rends compte des indices, la taille de la table, etc. peuvent affecter cela.
En outre, vous réalisé peut probablement pas comparer un peu à -1 ...
Juste pensé que je partage.
essayer
select ...
from table
where column = case when @bit = 0 then 0 else column end
cela fonctionne quel que soit le type de données de la colonne est (pourrait même être une chaîne, par exemple). Si elle était, bien sûr, ce serait une valeur par défaut différente (pas 0)
WHERE colonne> = @bit
Cependant, cela ne fonctionne que pour> 0 valeurs dans une colonne numérique. @bit seront jetés implicitement int, smallint etc à cause de la priorité du type de données.