requête sql - vrai => true, false => vrai ou faux
Simple requête, éventuellement impossible, mais je sais qu'il ya des gens intelligents là-bas 🙂
Donné un paramètre booléen, je tiens à définir ma clause where pour limiter une certaine colonne de sortie - ou ne rien faire.
Puisque le paramètre @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
c'est à dire sans effet/afficher tous les résultats (colonne est un champ de bits)
Je ne suis pas vouloir sql dynamique - je peux régler pour la fixation de cette dans le code, mais j'ai juste demandé s'il y avait quelques petits malins de la magie qui ferait de la ci-dessus pur et simple.
Est-il? Je suis l'aide de sql server.
cheers 😀
OriginalL'auteur Tabloo Quijico | 2009-06-26
Vous devez vous connecter pour publier un commentaire.
La réponse
column = 1 or @bit = 0
fonctionne si la colonne ne peut être 0 ou 1. Si la colonne peut être n'importe quelle valeur que vous voulez:column = 1 or @bit = 0 and column = 0
.J'ai manqué que vous avez dit que la colonne est un champ de bits!
assurez-vous d'ajouter des parenthèses lorsque l'on mélange ET et OU
C'est un modèle commun pour les requêtes de rapport, où peut-être vous avez un filtre pour certaines catégorie, mais veulent aussi une option pour filtrer par "Toutes Catégories"
OriginalL'auteur Adam Luter
Si vous avez un index sur
column1
, ce sera plus efficace:Voir cet article dans mon blog de comparer la performance d'un seul
WHERE
condition vsUNION ALL
:column
ne peut être 0 ou 1 ce est exact-mais certainement à l'aide d'unUNION ALL
est de moins en moins efficace. La première réduit dans l'optimiseur soitWHERE column = 1
ou sans clause where à tous (quand @bit = 0). LeUNION ALL
pourrait ne pas être pris par l'optimiseur (et si elle le fait, elle ne peut pas être pire que la première).Luter: l'UNION de TOUS est plus efficace dans SQL Server, que les requêtes seront optimisés loin. La première requête est toujours utiliser de l'ANALYSE COMPLÈTE, même si @bit = 1.
Pauvres SQL Server!
OriginalL'auteur Quassnoi
OriginalL'auteur A-K
OriginalL'auteur Scott Ivey
OriginalL'auteur Martin Robins
J'ai dû venir avec une réponse différente et se sentait stupide en voyant le consensus de réponse.
Donc, juste pour yucks, a comparé les deux à l'aide de ma propre base de données. Je ne sais pas vraiment si ils sont vraiment comparables, mais mes plans d'exécution de donner un léger avantage à mon dingo réponse:
select *
from MyTable
où la colonne <> cas @bits lorsque 1 alors 0 sinon -1 fin
Je me rends compte que des indices, la taille de la table, etc. peuvent l'affecter.
Aussi, de réaliser que vous ne pouvez probablement pas le comparer un peu à -1...
Juste pensé que je vous ferais partager.
OriginalL'auteur Rich
essayer cette
cela fonctionne quel que soit le type de données de colonne est (peut-être même une chaîne de caractères, par exemple). Si elle l'était, bien sûr, ce serait une autre valeur par défaut (0)
OriginalL'auteur eeeeaaii
OÙ la colonne >= @bit
Toutefois, cela ne fonctionne que pour les > 0 valeurs dans une colonne numérique. @bit sera implicitement convertie en int, smallint, etc raison de la priorité des types de données.
OriginalL'auteur gbn