SQL-Abfrage - true => true, false => wahr oder falsch
-
20-08-2019 - |
Frage
Einfache Abfrage, möglicherweise unmöglich, aber ich weiß, es gibt einige klug Leute da draußen:)
Bei einem boolean Parameter möchte ich meine, wo Klausel definieren, entweder eine bestimmte Spalte Ausgabe zu begrenzen -. Oder nichts tun
So, da Parameter @bit = 1 wäre dies das Ergebnis:
Dabei gilt Spalte = 1
angegebene Parameter @bit = 0 wäre dies das Ergebnis:
Dabei gilt Spalte = 1 oder 0
d. keine Wirkung hat / zeigt alle Ergebnisse (Spalte ist ein Bit-Feld)
Ich will nicht dynamische SQL -. Ich für die Festsetzung dieses in Code begleichen kann, aber ich frage mich, ob es eine kluge Magie, die die oben sauber und einfach machen würde
Gibt es? Ich bin mit SQL Server.
cheers: D
Lösung
Die Antwort column = 1 or @bit = 0
funktioniert, wenn Spalte nur 0 sein kann oder 1. Wenn Spalte einen beliebigen Wert sein können, die Sie wollen. column = 1 or @bit = 0 and column = 0
Andere Tipps
SELECT *
FROM mytable
WHERE column = 1 OR @bit = 0
Wenn Sie einen Index auf column1
haben, dieser wird effizienter:
SELECT *
FROM mytable
WHERE column = 1 AND @bit = 1
UNION ALL
SELECT *
FROM mytable
WHERE @bit = 0
Lesen Sie diesen Artikel in meinem Blog für Performance-Vergleich eines einzelnen WHERE
Zustand vs. 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)
Ich hatte mit einer anderen Antwort kommen und fühlte sich stumm, wenn die Consensus-Antwort zu sehen. Also, nur für yucks, verglich die beiden meine eigene Datenbank. Ich weiß wirklich nicht, ob sie wirklich vergleichbar sind, aber meine Ausführungspläne geben einen leichten Vorteil meiner doof Antwort:
select *
von MyTable
wo Spalte <> Fall @bit wenn 1 dann 0, sonst -1 Ende
Ich weiß, Indizes, Tischgröße, usw. diese beeinflussen kann.
Außerdem realisiert man wahrscheinlich nicht ein bisschen zu einer -1 ...
vergleichen
Ich dachte, ich würde Aktie.
try this
select ...
from table
where column = case when @bit = 0 then 0 else column end
Dies funktioniert unabhängig davon, was der Datentyp der Spalte ist (könnte auch eine Zeichenfolge sein, zum Beispiel). Wenn es so wäre, natürlich wäre es ein anderer Standardwert (nicht 0) sein
WHERE column> = @bit
Dies funktioniert jedoch nur für> 0 Werte in einer numerischen Spalte. @bit wird implizit int gegossen werden, smallint etc wegen Datentyp Vorrang.