我如何使用T-SQL Case / When?

时间:2010-07-27 09:40:59

标签: tsql case-when

我有一个巨大的查询,经常使用 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个案例/小时中的一个纠正了这一点,但我需要它们两个,可能更多的情况。

4 个答案:

答案 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