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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top