J'ai une énorme requête qui utilise case/when souvent. Maintenant, j'ai ce code SQL ici, qui ne fonctionne pas.
(select case when xyz.something = 1
then
'SOMETEXT'
else
(select case when xyz.somethingelse = 1)
then
'SOMEOTHERTEXT'
end)
(select case when xyz.somethingelseagain = 2)
then
'SOMEOTHERTEXTGOESHERE'
end)
end) [ColumnName],
Ce qui cause problème est xyz.somethingelseagain = 2
, il est dit qu'il ne peut pas lier cette expression. xyz est un alias pour une table qui est jointe plus bas dans la requête. Quel est le problème ici? Supprimer l'un des 2 cas/qui corrige cela, mais il me faut les deux, probablement même plus de cas.
SELECT
CASE
WHEN xyz.something = 1 THEN 'SOMETEXT'
WHEN xyz.somethingelse = 1 THEN 'SOMEOTHERTEXT'
WHEN xyz.somethingelseagain = 2 THEN 'SOMEOTHERTEXTGOESHERE'
ELSE 'SOMETHING UNKNOWN'
END AS ColumnName;
Dès qu'une déclaration WHEN est vraie, l'interruption est implicite.
Vous devrez déterminer quelle expression de WHEN est la plus susceptible de se produire. Si vous placez WHEN à la fin d'une longue liste d'instructions WHEN, votre SQL sera probablement plus lent. Alors mettez-le en avant comme le premier.
Plus d'informations ici: Instruction de casse dans la casse dans T-SQL
declare @n int = 7,
@m int = 3;
select
case
when @n = 1 then
'SOMETEXT'
else
case
when @m = 1 then
'SOMEOTHERTEXT'
when @m = 2 then
'SOMEOTHERTEXTGOESHERE'
end
end as col1
-- n=1 => returns SOMETEXT regardless of @m
-- n=2 and m=1 => returns SOMEOTHERTEXT
-- n=2 and m=2 => returns SOMEOTHERTEXTGOESHERE
-- n=2 and m>2 => returns null (no else defined for inner case)
Si le test logique concerne une seule colonne, vous pouvez utiliser quelque chose comme:
USE AdventureWorks2012;
GO
SELECT ProductNumber, Category =
CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
Name
FROM Production.Product
ORDER BY ProductNumber;
GO
Plus d'informations - https://docs.Microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017