OU não é suportado com a instrução CASE no SQL Server

572

O ORoperador na WHENcláusula de uma CASEinstrução não é suportado. Como posso fazer isso?

CASE ebv.db_no 
    WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500' 
    ELSE 'WECS 9520' 
END as wecs_system 
Werner
fonte
O SQL Standard permite vários valores: stackoverflow.com/a/54562580/5070879
Lukasz Szozda 10/10/19

Respostas:

1079

Esse formato requer que você use:

CASE ebv.db_no 
  WHEN 22978 THEN 'WECS 9500' 
  WHEN 23218 THEN 'WECS 9500'  
  WHEN 23219 THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

Caso contrário, use:

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Pôneis OMG
fonte
9
Para o segundo caso, por que apenas 'IN' funciona e não '='?
Han
25
=funcionaria se você estivesse comparando com um único valor. No entanto, (22978, 23218, 23219)é uma matriz e INé necessário corresponder apenas a um dos valores.
LdTrigger
2
Isso realmente fede - o t-sql não consegue lidar com um "ou" em uma instrução de caso. Chegou a hora da Microsoft crescer a partir do status do banco de dados de brinquedos.
Rich Bianco
1
"não pode lidar com um" ou "em uma declaração de caso" .. hmmm .... eu acho que nunca vi um switch aceitar um "ou" em qualquer idioma. parece derrotar o propósito de uma troca. quais idiomas aceitam "ou" em um caso?
Heriberto Lugo 24/01
2
@Heriberto Lugo Não sei quantas línguas você conhece, mas existem pelo menos algumas. VB.NET e C # podem usá-los com simples separação por vírgula. Ele não derrota nada, pois evita que você repita o mesmo código em vários casos por nada.
Johnny Prescott
249
CASE
  WHEN ebv.db_no = 22978 OR 
       ebv.db_no = 23218 OR
       ebv.db_no = 23219
  THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Darren
fonte
38
votado - esta resposta agrega valor. Ele se encaixa melhor na pergunta do OP e, se você deseja aninhar alguns CASE-WHENS, essa sintaxe reduz consideravelmente o código necessário.
Matt Kemp
1
@ Leigh Agradeço esta resposta. É bom ter todos os diferentes formatos em um thread e o torna mais útil como referência.
Jason Wheeler
3
@ Bigwheels - Uau .. isso foi há um tempo atrás. Provavelmente discordei porque, logicamente, é exatamente o mesmo que outras respostas . Dito isto, você e Matt fazem pontos válidos. Se a pergunta for "qual é a sintaxe correta usando somente OR ", isso fornece uma resposta. No entanto, se "reduzir a sintaxe necessária" era o objetivo, a resposta aceita é mais compacta. Aliás, não é um slam na resposta de Darren, que é perfeitamente válida. Just my $ 0,02 :)
Leigh
2
usando INpalavra-chave é muito melhor maneira
Sagar Naliyapara
57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Cade Roux
fonte
53

Você pode usar uma das expressões que WHEN possui, mas não pode misturar as duas.

  1. WHEN when_expression

    É uma expressão simples à qual a expressão_de_ entrada é comparada quando o formato CASE simples é usado. when_expression é qualquer expressão válida. Os tipos de dados de expressão de entrada e cada expressão de quando devem ser os mesmos ou devem ser uma conversão implícita.

  2. WHEN Boolean_expression

    A expressão booleana é avaliada ao usar o formato CASE pesquisado. Expressão booleana é qualquer expressão booleana válida.

Você pode programar:

1

    CASE ProductLine
            WHEN 'R' THEN 'Road'
            WHEN 'M' THEN 'Mountain'
            WHEN 'T' THEN 'Touring'
            WHEN 'S' THEN 'Other sale items'
            ELSE 'Not for sale'

2)

    CASE
            WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
            WHEN ListPrice < 50 THEN 'Under $50'
            WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
            WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
            ELSE 'Over $1000'
          END

Mas, em qualquer caso, você pode esperar que a classificação da variável seja comparada em uma expressão booleana.

Consulte CASE (Transact-SQL) (MSDN).

Alfaplus
fonte
37

Já existem muitas respostas em relação a CASE. Vou explicar quando e como usar CASE.

Você pode usar expressões CASE em qualquer lugar nas consultas SQL. As expressões CASE podem ser usadas nas instruções SELECT, WHERE, Order by cláusula, HAVING, Insert, UPDATE e DELETE.

Uma expressão CASE possui os dois formatos a seguir:

  1. Expressão CASE simples

    CASE expression
    WHEN expression1 THEN Result1
    WHEN expression2 THEN Result2
    ELSE ResultN
    END

    Isso compara uma expressão a um conjunto de expressões simples para encontrar o resultado. Essa expressão compara uma expressão à expressão em cada cláusula WHEN para equivalência. Se a expressão na cláusula WHEN for correspondida, a expressão na cláusula THEN será retornada.

    É aqui que a questão do OP está caindo. 22978 OR 23218 OR 23219não receberá um valor igual à expressão ie ebv.db_no. É por isso que está dando um erro. Os tipos de dados de expressão de entrada e cada expressão de quando devem ser os mesmos ou devem ser uma conversão implícita.

  2. Expressões CASE pesquisadas

    CASE
    WHEN Boolean_expression1 THEN Result1
    WHEN Boolean_expression2 THEN Result2
    ELSE ResultN
    END

    Esta expressão avalia um conjunto de expressões booleanas para encontrar o resultado. Essa expressão permite operadores de comparação e operadores lógicos AND / OR em cada expressão booleana.

Instrução 1.SELECT com expressões CASE

--Simple CASE expression: 
SELECT FirstName, State=(CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

-- Searched CASE expression:
SELECT FirstName,State=(CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

Instrução 2.Update com expressão CASE

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

Cláusula 3.ORDER BY com expressões CASE

-- Simple CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Gender WHEN 'F' THEN LastName END ASC

-- Searched CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE WHEN Gender='M' THEN FirstName END Desc,
 CASE WHEN Gender='F' THEN LastName END ASC

4.Having Clause com expressão CASE

-- Simple CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE Gender WHEN 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE Gender WHEN 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

-- Searched CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE WHEN Gender = 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE WHEN Gender = 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

Espero que esses casos de uso ajudem alguém no futuro.

Fonte

Somnath Muluk
fonte
34

Tentar

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
JNK
fonte
28
SELECT
  Store_Name,
  CASE Store_Name
    WHEN 'Los Angeles' THEN Sales * 2
    WHEN 'San Diego' THEN Sales * 1.5
    ELSE Sales
    END AS "New Sales",
  Txn_Date
FROM Store_Information;
Archu
fonte
1
Voto a favor devido à inclusão de um ELSE Salescampo, que retorna o valor padrão, se não mais estiver incluído em uma instrução de caso, apropriado para consultas de negócios.
FoxDeploy
3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts
Debendra Dash
fonte
1
Por que você não explica o que está sendo feito aqui? É importante dar respostas completas com explicações como alguns novatos pode precisar que, a fim de compreender como isso resolver o problema
Gerhard Barnard
3
UPDATE table_name 
  SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
END

table_name = O nome da tabela na qual você deseja executar a operação.

column_name = O nome da coluna / campo cujo valor você deseja definir.

update_value = O valor que você deseja definir column_name

Anand agrawal
fonte
11
Embora esse código possa resolver o problema do OP, algumas palavras explicativas seriam ainda mais úteis para futuros leitores.
Thom
-5
Select s.stock_code,s.stock_desc,s.stock_desc_ar,
mc.category_name,s.sel_price,
case when s.allow_discount=0 then 'Non Promotional Item' else 'Prmotional 
item' end 'Promotion'
From tbl_stock s inner join tbl_stock_category c on s.stock_id=c.stock_id
inner join tbl_category mc on c.category_id=mc.category_id
where mc.category_id=2 and s.isSerialBased=0 
Mohammad Shahnawaz
fonte
1
Esta resposta parece não ter nada a ver com a pergunta.
LarsTech
4
Por favor, não poste código simples, também forneça uma explicação do que seu código está fazendo.
Jonathan Mee