OK, die x-te bedingte Spalte Frage:Wie wird eine Spalte in einer WHERE-Klausel bedingt gefiltert?
Ich schreibe ein gespeichertes Proc, das einen Eingabeparameter verwendet, der einer von mehreren Flag-Spalten zugeordnet ist. Was ist der beste Weg, um die angeforderte Spalte zu filtern? Ich bin derzeit auf SQL2000, aber im Begriff, zu SQL2008 zu wechseln, also nehme ich eine zeitgenössische Lösung, wenn jemand verfügbar ist.
Die Tabelle im sproc abgefragt sieht aus wie
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
und ich so etwas wie
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
so tun, wenn ich die sproc wie exec uspMyProc @flag = 'foo'
nenne ich Reihen zurück würde 1 und 4 .
Ich weiß, ich kann nicht den Teil in Parens direkt in SQL. Um dynamisches SQL zu erstellen, muss ich die gesamte Abfrage in eine Zeichenfolge stopfen, den @flag-Parameter in der WHERE-Klausel verketten und dann die Zeichenfolge ausführen. Abgesehen von dem dreckigen Gefühl, das ich beim Ausführen von dynamischem SQL erhalte, ist meine Abfrage ziemlich groß (ich wähle ein paar Dutzend Felder, verbinde 5 Tabellen, rufe ein paar Funktionen auf), also ist es eine große, riesige Zeichenkette wegen einer einzelnen Zeile in einem 3-Zeilen-WHERE-Filter.
Alternativ könnte ich 4 Kopien der Abfrage haben und unter ihnen in einer CASE-Anweisung auswählen. Dadurch bleibt der SQL-Code direkt ausführbar (und unterliegt einem Syntax-Highlighting usw.), aber auf Kosten der Wiederholung großer Codeabschnitte, da ich den CASE nicht nur für die WHERE-Klausel verwenden kann.
Gibt es noch andere Optionen? Irgendwelche kniffligen Joins oder logischen Operationen, die angewendet werden können? Oder sollte ich nur darüber hinwegkommen und das dynamische SQL ausführen?
"exec uspMyProc @flag = 'foo' Ich würde Zeile 1 zurück erhalten." Warum nur Zeile 1 und nicht auch Zeile 4? –
@Mark - oh, ja, behoben! – Val