Как мне использовать T-SQL Case / Когда? - PullRequest
40 голосов
/ 27 июля 2010

У меня огромный запрос, который использует case / когда часто.Теперь у меня есть этот 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 - это псевдоним для таблицы, которая присоединяется в запросе ниже.Что здесь не так?Удаление одного из двух случаев / когда исправляет это, но мне нужны оба, возможно, даже больше случаев.

Ответы [ 4 ]

89 голосов
/ 27 июля 2010
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;
8 голосов
/ 30 октября 2012

Как только оператор WHEN верен, разрыв неявен.

Вам нужно будет определить, какое выражение WHEN наиболее вероятно произойдет.Если вы поместите это WHEN в конец длинного списка операторов WHEN, ваш sql, вероятно, будет медленнее.Так что говорите первым:

Более подробная информация здесь: break в выражении case в T-SQL

1 голос
/ 28 января 2019

Если логический тест относится к одному столбцу, вы можете использовать что-то вроде

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

1 голос
/ 10 января 2018
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)
...