Подтвердить что ты не робот

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

4b9b3361

Ответ 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;

Ответ 2

Как только инструкция WHEN истинна, разрыв является неявным.

Вам нужно будет понять, какое КОЛИЧЕСТВО Выражение наиболее вероятно. Если вы укажете, что WHEN в конце длинного списка инструкций WHEN, ваш sql, скорее всего, будет медленнее. Поэтому поставим его первым, как первый.

Дополнительная информация здесь: break in case statement в T-SQL

Ответ 3

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)

Ответ 4

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

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