我有一个巨大的查询,经常使用 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个案例/小时中的一个纠正了这一点,但我需要它们两个,可能更多的情况。
答案 0 :(得分:88)
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;
答案 1 :(得分:8)
一旦WHEN陈述为真,休息就是隐含的。
你必须得到最有可能发生的表达。如果你将WHEN放在WHEN语句的长列表的末尾,那么你的sql可能会变慢。所以把它放在第一位。
此处提供更多信息:break in case statement in T-SQL
答案 2 :(得分:1)
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)
答案 3 :(得分:1)
如果对单个列进行逻辑测试,则可以使用
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