Ich habe eine große Abfrage, die case/when häufig verwendet. Jetzt habe ich diese SQL hier, die nicht funktioniert.
(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],
Was ärgerlich ist xyz.somethingelseagain = 2
, besagt, dass es diesen Ausdruck nicht binden konnte. xyz ist ein Alias für eine Tabelle, die in der Abfrage weiter unten eingefügt wird. Was ist hier los? Das Entfernen eines der beiden Fälle/Zeitpunkte korrigiert das, aber ich brauche beide, wahrscheinlich sogar mehr Fälle.
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;
Sobald eine WHEN-Anweisung wahr ist, ist der Bruch implizit.
Sie müssen sich überlegen, welches WENN am wahrscheinlichsten ist. Wenn Sie dieses WHEN am Ende einer langen Liste von WHEN-Anweisungen setzen, ist Ihre SQL wahrscheinlich langsamer. Also als erstes nach vorne stellen.
Weitere Informationen hier: break in case-Anweisung in 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)
Wenn sich der logische Test gegen eine einzelne Spalte richtet, können Sie so etwas verwenden
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
Weitere Informationen - https://docs.Microsoft.com/de-de/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017