w3schools - select case sql server ejemplos
SQL Switch/Case in where cláusula (10)
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 cerca de ser correcta. SQL sigue quejándose de mi ''='' en la primera línea WHEN ...
¡Ayuda!
Aqui tienes.
SELECT
column1,
column2
FROM
viewWhatever
WHERE
CASE
WHEN @locationType = ''location'' AND account_location = @locationID THEN 1
WHEN @locationType = ''area'' AND xxx_location_area = @locationID THEN 1
WHEN @locationType = ''division'' AND xxx_location_division = @locationID THEN 1
ELSE 0
END = 1
El operador O puede ser una alternativa de caso cuando en donde condición
ALTER PROCEDURE [dbo].[RPT_340bClinicDrugInventorySummary]
-- Add the parameters for the stored procedure here
@ClinicId BIGINT = 0,
@selecttype int,
@selectedValue varchar (50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT
drugstock_drugname.n_cur_bal,drugname.cdrugname,clinic.cclinicname
FROM drugstock_drugname
INNER JOIN drugname ON drugstock_drugname.drugnameid_FK = drugname.drugnameid_PK
INNER JOIN drugstock_drugndc ON drugname.drugnameid_PK = drugstock_drugndc.drugnameid_FK
INNER JOIN drugndc ON drugstock_drugndc.drugndcid_FK = drugndc.drugid_PK
LEFT JOIN clinic ON drugstock_drugname.clinicid_FK = clinic.clinicid_PK
WHERE (@ClinicId = 0 AND 1 = 1)
OR (@ClinicId != 0 AND drugstock_drugname.clinicid_FK = @ClinicId)
-- Alternative Case When You can use OR
AND ((@selecttype = 1 AND 1 = 1)
OR (@selecttype = 2 AND drugname.drugnameid_PK = @selectedValue)
OR (@selecttype = 3 AND drugndc.drugid_PK = @selectedValue)
OR (@selecttype = 4 AND drugname.cdrugclass = ''C2'')
OR (@selecttype = 5 AND LEFT(drugname.cdrugclass, 1) = ''C''))
ORDER BY clinic.cclinicname, drugname.cdrugname
END
El problema con esto es que cuando el motor SQL va a evaluar la expresión, comprueba la parte FROM para extraer las tablas adecuadas, y luego la parte WHERE para proporcionar algunos criterios básicos, por lo que no puede evaluar adecuadamente una condición dinámica en qué columna comprobar contra.
Puede usar una cláusula WHERE cuando está verificando los criterios WHERE en el predicado, como
WHERE account_location = CASE @locationType
WHEN ''business'' THEN 45
WHEN ''area'' THEN 52
END
Entonces, en su caso particular, necesitará colocar la consulta en un procedimiento almacenado o crear tres consultas separadas.
Por favor prueba esta consulta Respuesta a la publicación anterior:
select @msgID, account_id
from viewMailAccountsHeirachy
where
CASE @smartLocationType
WHEN ''store'' THEN account_location
WHEN ''area'' THEN xxx_location_area
WHEN ''division'' THEN xxx_location_division
WHEN ''company'' THEN xxx_location_company
END = @smartLocation
Prueba esta consulta Es muy fácil de entender:
CREATE TABLE PersonsDetail(FirstName nvarchar(20), LastName nvarchar(20), GenderID int);
GO
INSERT INTO PersonsDetail VALUES(N''Gourav'', N''Bhatia'', 2),
(N''Ramesh'', N''Kumar'', 1),
(N''Ram'', N''Lal'', 2),
(N''Sunil'', N''Kumar'', 3),
(N''Sunny'', N''Sehgal'', 1),
(N''Malkeet'', N''Shaoul'', 3),
(N''Jassy'', N''Sohal'', 2);
GO
SELECT FirstName, LastName, Gender =
CASE GenderID
WHEN 1 THEN ''Male''
WHEN 2 THEN ''Female''
ELSE ''Unknown''
END
FROM PersonsDetail
Prueba esto:
WHERE (
@smartLocationType IS NULL
OR account_location = (
CASE
WHEN @smartLocationType IS NOT NULL
THEN @smartLocationType
ELSE account_location
END
)
)
Yo diría que esto es un indicador de una estructura de tabla defectuosa. Tal vez los diferentes tipos de ubicación se deben separar en diferentes tablas, lo que le permite hacer consultas mucho más ricas y también evitar tener columnas superfluas alrededor.
Si no puede cambiar la estructura, algo como el siguiente podría funcionar:
SELECT
*
FROM
Test
WHERE
Account_Location = (
CASE LocationType
WHEN ''location'' THEN @locationID
ELSE Account_Location
END
)
AND
Account_Location_Area = (
CASE LocationType
WHEN ''area'' THEN @locationID
ELSE Account_Location_Area
END
)
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 ignoren las mías.
sin una declaración de caso ...
SELECT column1, column2
FROM viewWhatever
WHERE
(@locationType = ''location'' AND account_location = @locationID)
OR
(@locationType = ''area'' AND xxx_location_area = @locationID)
OR
(@locationType = ''division'' AND xxx_location_division = @locationID)
Case Statement in SQL Server Example
Syntax
CASE [ expression ]
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
WHEN condition_n THEN result_n
ELSE result
END
Example
SELECT contact_id,
CASE website_id
WHEN 1 THEN ''TechOnTheNet.com''
WHEN 2 THEN ''CheckYourMath.com''
ELSE ''BigActivities.com''
END
FROM contacts;
OR
SELECT contact_id,
CASE
WHEN website_id = 1 THEN ''TechOnTheNet.com''
WHEN website_id = 2 THEN ''CheckYourMath.com''
ELSE ''BigActivities.com''
END
FROM contacts;
declare @locationType varchar(50);
declare @locationID int;
SELECT column1, column2
FROM viewWhatever
WHERE
@locationID =
CASE @locationType
WHEN ''location'' THEN account_location
WHEN ''area'' THEN xxx_location_area
WHEN ''division'' THEN xxx_location_division
END