case/whenを頻繁に使用する巨大なクエリがあります。ここにこのSQLがありますが、これは機能しません。
(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],
問題の原因はxyz.somethingelseagain = 2
、その式をバインドできなかったと言います。 xyzは、クエリのさらに下に結合されるテーブルのエイリアスです。どうしたの? 2つのケース/時のうちの1つを削除するとそれが修正されますが、私は両方を必要とし、おそらくさらに多くのケースが必要です。
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;
WHENステートメントが真であるとすぐに、ブレークは暗黙的です。
どの表現が起こる可能性が最も高いかを検討する必要があります。 WHENステートメントの長いリストの最後にそのWHENを配置すると、SQLが遅くなる可能性があります。それで最初にそれを前に置いてください。
詳細はこちら: T-SQLのcaseステートメントのブレーク
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)
論理テストが単一の列に対して行われる場合、次のようなものを使用できます
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
詳細- https://docs.Microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017