when w3schools hacer example ejemplos cómo sql switch-statement case

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