51

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

4

4 回答 4

105
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;
于 2010-07-27T09:45:06.300 回答
8

一旦 WHEN 语句为真,中断是隐含的。

您将不得不考虑哪个 WHEN 表达式最有可能发生。如果您将 WHEN 放在一长串 WHEN 语句的末尾,您的 sql 可能会变慢。所以把它作为第一个放在前面。

更多信息:break in case statement in T-SQL

于 2012-10-30T14:57:02.913 回答
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)
于 2018-01-10T10:59:13.903 回答
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

于 2019-01-28T09:44:36.297 回答