Traté de buscar, pero no pude encontrar nada que me ayudara.
Estoy tratando de hacer esto en SQL:
declare @locationType varchar(50);
declare @locationID int;
SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
WHEN 'location' THEN account_location = @locationID
WHEN 'area' THEN xxx_location_area = @locationID
WHEN 'division' THEN xxx_location_division = @locationID
Sé que no debería tener que poner '= @locationID' al final de cada uno, pero no puedo obtener la sintaxis ni siquiera cerca de ser correcta. SQL sigue quejándose de mi '=' en la primera línea CUANDO ...
¿Cómo puedo hacer esto?
sql
switch-statement
case
Millas
fuente
fuente
sin una declaración de caso ...
fuente
DECLARE @locationType NVARCHAR(50) = 'youchoose' IF @locationType = 'location' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (account_location = @locationID) END IF @locationType = 'area' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_area = @locationID) END IF @locationType = 'division' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_division = @locationID) END
Aqui tienes.
fuente
Yo diría que este es un indicador de una estructura de tabla defectuosa. Quizás los diferentes tipos de ubicación deberían estar separados en diferentes tablas, lo que le permite realizar consultas mucho más completas y también evitar tener columnas superfluas.
Si no puede cambiar la estructura, algo como lo siguiente podría funcionar:
Y así sucesivamente ... No podemos cambiar la estructura de la consulta sobre la marcha, pero podemos anularla haciendo que los predicados se igualen.
EDITAR: Las sugerencias anteriores son, por supuesto, mucho mejores, solo ignora las mías.
fuente
El problema con esto es que cuando el motor SQL va a evaluar la expresión, verifica la parte DE para extraer las tablas adecuadas, y luego la parte de DÓNDE para proporcionar algunos criterios básicos, por lo que no puede evaluar adecuadamente una condición dinámica en qué columna comprobar en contra.
Puede usar una cláusula WHERE cuando verifica los criterios WHERE en el predicado, como
entonces, en su caso particular, necesitará poner la consulta en un procedimiento almacenado o crear tres consultas separadas.
fuente
El operador O puede ser una alternativa de caso cuando está en condiciones
fuente
Por favor intente esta consulta. Respuesta a la publicación anterior:
fuente
Prueba esto:
fuente
fuente
fuente
Prueba esta consulta. Es muy fácil de entender:
fuente