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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top