Dynamische where-Klausel basiert auf variable
Arbeite ich an einer select-Anweisung in SQL und bin in Probleme laufen, die versuchen, um eine where-Klausel enthält eine case-Anweisung oder einer if-else-Anweisung. Ich möchten wählen Sie Datensätze basierend auf dem Wert einer Variablen. Wenn die variable ist 'True', dann nur Datensätze zurück, die von der select-Anweisung, wo eine Spalte null ist. Wenn die variable nicht 'True', dann alle Datensätze zurück, unabhängig davon, ob die Spalten null ist.
Irgendwelche Tipps, wie dies zu tun?
Unten ist ein einfaches Beispiel von, was ich versuche zu tun:
declare @option1 as varchar(5)
--This can be True or False so to test i just put the Set option below
set @option1 = 'True'
Select a,b,c,d...
from ...
where d = case when @option1 = 'True' then NULL End
Dies ist der Teil wo ich nicht weiß, was zu tun ist. Ich brauche nur zum filtern der Datensätze aus, wenn die variable "Wahr" ist also nicht sicher, was in dem anderen Abschnitt der Fall.
InformationsquelleAutor Ben | 2012-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht test für
d = NULL
als deine CASE-Anweisung funktioniert, weil das wird immer false zurückgeben, da NULL ist nicht gleich NULL (es sei denn, Sie set ANSI_NULLS auf 'off').Die einfachste Sache zu tun wäre, um ändern Sie die WHERE-Klausel:
Wenn Sie lieber eine CASE-Anweisung aus irgendeinem Grund, Sie können schreiben Sie es so:
InformationsquelleAutor PinnyM
:
UPDATE: PinnyM hat richtete mich auf. Ich verlasse mein peinlich logisch fehlerhaft-argument hier für die Bildung der Massen. Die Lösung, die ich vorschlagen nach unten "Versuchen, diese" ist sicherlich immer noch gültig, aber PinnyM Lösungen ist bei weitem eleganter und verwendet werden soll.
Immer wieder alle gegebenen Ergebnisse seiner aktuellen select-Anweisung (vorausgesetzt, @Option1 ist einfach ein flag-parameter übergeben).
Versuchen Sie dies:
Wenn ich verstehe den OP ' s Frage (und es IST für die interpretation!), Option1 ist nicht ein Feld in der Tabelle, und daher den status Option1 hat keinen Einfluss auf die Filterung von Datensätzen. In Ihrer vorgeschlagenen WHERE-Klausel werden Alle Zeilen, in denen d NICHT NULL enthalten, egal, der Wert Option1, und alle Zeilen, in denen d NULL IST, wird auch immer aufgenommen werden. Es gibt keine Filterung (es sei denn, ich bin fehlt etwas albern, das ist durchaus möglich).
Ich glaube, die zweite option funktioniert der trick obwohl.
Sicherlich @Option1 ist nicht ein Feld in der Tabelle, aber wenn Sie einen filter hinzufügen, wie dies:
WHERE 'True' = 'False'
Sie effektiv ausschließen aller Zeilen, auch wenn keine Spalten wurden als Teil der where-Klausel. Probieren Sie es aus und sehen. Daher die erste option funktioniert und empfohlen für seine Einfachheit.Boah. Interessant. Werde ich definitiv probieren Sie es aus und sehen. Glaube nicht, dass es der Weg (und ein wenig peinlich für Sie), aber ich vermute(Ok, ist zu vermuten, nichts, ich WEIß), sind Sie richtig. Aber ich habe einfach zu laufen, es mich, wie eine Art berühren, die red-hot-Brenner, um zu sehen, ob es wirklich "heiß". Nett gemacht +1
InformationsquelleAutor XIVSolutions