sql-Abfrage - wahr => true, false => true oder false
Einfache Abfrage, vielleicht unmöglich, aber ich weiß, es gibt einige kluge Leute, die es gibt 🙂
Gegeben einen booleschen parameter, die ich definieren will meine where-Klausel, um entweder begrenzen einer bestimmten Spalte der output - oder gar nichts.
So, gegebenen parameter @bit = 1 wäre dies das Ergebnis:
wo Spalte = 1
gegebenen parameter @bit = 0 wäre dies das Ergebnis:
wo Spalte = 1 oder 0
d.h. keine Wirkung haben/zeigen alle Ergebnisse (Spalte ist ein bit-Feld)
Ich bin die nicht wollen, dass eine dynamische sql - ich kann Regeln für die Festsetzung dieser im code, aber ich habe nur gefragt, ob es etwas clever Magie, die machen würde, die oben sauber und einfach.
Gibt es? Ich bin mit sql server.
prost 😀
InformationsquelleAutor Tabloo Quijico | 2009-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort
column = 1 or @bit = 0
funktioniert, wenn Spalte kann nur 0 oder 1 sein. Wenn Spalte kann ein beliebiger Wert, den Sie wollen:column = 1 or @bit = 0 and column = 0
.Ich vermisste, dass Sie gesagt haben-Spalte wurde ein bit-Feld!
werden Sie sicher, dass Sie Klammern, wenn Sie mischen UND und ODER
Dies ist ein besonders häufiges Muster für den Bericht Abfragen, wo haben Sie vielleicht einen filter für einige Kategorie, sondern wollen auch eine option zum filtern von 'Alle Kategorien'
InformationsquelleAutor Adam Luter
Wenn Sie über einen index auf
column1
, das wird effizienter:Finden Sie in diesem Artikel in meinem blog für den performance-Vergleich eines einzelnen
WHERE
Zustand vs.UNION ALL
:column
kann nur 0 oder 1 sein, das ist richtig-aber sicherlich mit einUNION ALL
ist weniger effizient. Das reduziert zunächst in der Optimierung entwederWHERE column = 1
oder ohne where-Klausel (wenn @bit = 0). DieUNION ALL
kann nicht gefangen werden, indem der Optimierer (und wenn es das tut, es kann nicht schlimmer sein als die erste).Luter: UNION effizienter in SQL Server, da eine der Abfragen optimiert werden entfernt. Die erste Abfrage wird immer VOLLSTÄNDIGER SCAN, auch wenn @bit = 1.
Armer SQL-Server!
InformationsquelleAutor Quassnoi
InformationsquelleAutor A-K
InformationsquelleAutor Scott Ivey
InformationsquelleAutor Martin Robins
Hatte ich eine andere Antwort und fühlte sich dumm, wenn man den Konsens beantworten.
Also, nur für yucks, verglich die beiden mit meiner eigenen Datenbank. Ich weiß wirklich nicht, ob Sie wirklich vergleichbar, aber meine Ausführung Pläne geben einen leichten Vorteil zu meiner doofen Antwort:
select *
from MyTable
wo Spalte <> Fall @bit wenn 1 then 0 else -1 end
Merke ich, Indizes, Tisch-Größe, etc. kann dieses beeinflussen.
Auch, klar, kann man wohl nicht vergleichen, ein bisschen auf -1...
Ich dachte würde ich teilen.
InformationsquelleAutor Rich
versuchen, diese
das funktioniert, egal, was der Datentyp der Spalte ist (könnte auch eine Zeichenfolge sein, zum Beispiel). Wenn Sie es waren, natürlich, wäre es eine andere default-Wert (nicht 0)
InformationsquelleAutor eeeeaaii
WHERE column >= @bit
Allerdings funktioniert dies nur für > 0-Werte in eine numerische Spalte. @bit wird implizit casten zu int, smallint etc, weil der Rangfolge der Datentypen.
InformationsquelleAutor gbn