OK, l'ennesima domanda di colonna condizionale:Come filtrare condizionalmente su una colonna in una clausola WHERE?
Sto scrivendo un processo memorizzato che accetta un parametro di input mappato su una delle colonne di flag diverse. Qual è il modo migliore per filtrare sulla colonna richiesta? Sono attualmente su SQL2000, ma sto per passare a SQL2008, quindi prenderò una soluzione contemporanea se disponibile.
La tabella interrogato nel sproc assomiglia
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
e voglio fare qualcosa di simile
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
così se io chiamo lo sproc come exec uspMyProc @flag = 'foo'
avrei avuto indietro le righe 1 e 4
So che non posso eseguire la parte in Paren direttamente in SQL. Per fare l'SQL dinamico, dovrò inserire l'intera query in una stringa, concatenare il parametro @flag nella clausola WHERE e quindi eseguire la stringa. A parte lo sporco sentimento che provo quando faccio SQL dinamico, la mia query è abbastanza ampia (seleziono una dozzina di campi, unisco 5 tavoli, chiamando un paio di funzioni), quindi è una grande stringa gigante a causa di una singola riga in un filtro WHERE a 3 righe.
In alternativa, potrei avere 4 copie della query e selezionarle in un'istruzione CASE. Questo lascia il codice SQL direttamente eseguibile (e soggetto alla sintassi hilighting, ecc.) Ma a costo di ripetere grossi blocchi di codice, dal momento che non posso usare il CASE solo sulla clausola WHERE.
Ci sono altre opzioni? Qualche joins difficile o operazioni logiche che possono essere applicate? O dovrei semplicemente superarlo ed eseguire l'SQL dinamico?
"exec uspMyProc @flag = 'foo' Vorrei tornare indietro riga 1". Perché solo riga 1 e non anche riga 4? –
@ Mark - d'oh, sì, corretto! – Val