OK, la enésima pregunta de la columna condicional:¿Cómo se filtra condicionalmente una columna en una cláusula WHERE?
Estoy escribiendo un proceso almacenado que toma un parámetro de entrada que está mapeado a una de varias columnas de indicadores. ¿Cuál es la mejor manera de filtrar en la columna solicitada? Actualmente estoy en SQL2000, pero estoy a punto de pasar a SQL2008, así que tomaré una solución contemporánea si hay una disponible.
La tabla consultada en el sproc parece
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
y quiero hacer algo como
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
así que si yo llamo el sproc como exec uspMyProc @flag = 'foo'
me vuelva filas 1 y 4
Sé que no puedo hacer la parte en parens directamente en SQL. Para hacer SQL dinámico, tendré que rellenar toda la consulta en una cadena, concatenar el parámetro @flag en la cláusula WHERE y luego ejecutar la cadena. Aparte de la sensación sucia que tengo al hacer SQL dinámico, mi consulta es bastante grande (estoy seleccionando un par de docenas de campos, uniendo 5 tablas, llamando a un par de funciones), por lo que es una gran cadena gigante, todo por una sola línea en un filtro WHERE de 3 líneas.
Como alternativa, podría tener 4 copias de la consulta y seleccionar entre ellas en una declaración CASE. Esto deja el código SQL directamente ejecutable (y sujeto a hilighting de sintaxis, etc.) pero a costa de repetir grandes fragmentos de código, ya que no puedo usar CASE solo en la cláusula WHERE.
¿Hay alguna otra opción? ¿Alguna complicada unión u operación lógica que se pueda aplicar? ¿O debería superarlo y ejecutar el SQL dinámico?
"exec uspMyProc @flag = 'foo' Volvería a la fila 1". ¿Por qué solo la fila 1 y no también la fila 4? –
@Mark - d'oh, sí, arreglado! – Val