O no es compatible con la instrucción CASE en SQL Server

La OR operador en el WHEN cláusula de un CASE declaración no es compatible. ¿Cómo puedo hacer esto?

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

preguntado el 30 de marzo de 11 a las 11:03

SQL Standard permite múltiples valores: stackoverflow.com/a/54562580/5070879 -

11 Respuestas

Ese formato requiere que uses:

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 

De lo contrario, use:

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

respondido 30 mar '11, 15:03

Para el segundo caso, ¿por qué solo funciona 'IN' y no '='? - Él

= funcionaría si estuviera comparando con un solo valor. Sin embargo, (22978, 23218, 23219) es una matriz y IN es necesario hacer coincidir solo uno de los valores. - Disparador Ld

Esto realmente apesta: t-sql no puede manejar una "o" en una declaración de caso. Vamos, es hora de Microsoft para crecer desde el estado de la base de datos de juguetes. - rico bianco

"No puedo manejar una" o "en una declaración de caso" ... hmmm .... No creo que haya visto un interruptor aceptar una "o" en ningún idioma. parecería frustrar el propósito de un cambio. ¿Qué idiomas aceptan "o" en un caso? - Heriberto Lugo

@Heriberto Lugo No sé cuántos idiomas conoces pero hay al menos algunos. VB.NET y C # pueden usarlos con una simple separación por comas. No anula nada, ya que le evitará repetir el mismo código en varios casos por nada. - johnny prescott

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 

Respondido 21 Abr '14, 08:04

voto positivo: esta respuesta agrega valor. Se ajusta más a la pregunta del OP, y si desea anidar algunos CASE-WHENS, esta sintaxis reduce considerablemente el código necesario. - Matt Kemp

@Leigh Agradezco esta respuesta. Es bueno tener todos los formatos diferentes en un hilo y lo hace más útil como referencia. - Jason Wheeler

@Bigwheels - Wow ... esto fue hace un tiempo. Probablemente no esté de acuerdo porque, lógicamente, es exactamente lo mismo que otras respuestas. Dicho esto, tú y Matt tienen puntos válidos. Si la pregunta era "¿cuál es la sintaxis correcta usando OR , solamente", esto proporciona una respuesta. Sin embargo, si" reducir la sintaxis necesaria "era el objetivo, la respuesta aceptada es más compacto. Por cierto, no es un golpe a la respuesta de Darren, que es perfectamente válida. Solo mis $ 0.02 :) - Leigh

usar IN la palabra clave es mucho mejor: sagar naliyapara

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

Respondido el 11 de Septiembre de 20 a las 22:09

Puede usar una de las expresiones que tiene WHEN, pero no puede mezclar ambas.

  1. CUANDO cuando_expresión

    Es una expresión simple con la que input_expression se compara cuando se usa el formato CASE simple. when_expression es cualquier expresión válida. Los tipos de datos de input_expression y cada when_expression deben ser iguales o deben ser una conversión implícita.

  2. CUANDO Boolean_expression

    Es la expresión booleana evaluada cuando se utiliza el formato CASE buscado. Boolean_expression es cualquier expresión booleana válida.

Podrías 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

Pero en cualquier caso, puede esperar que la clasificación de la variable se compare en una expresión booleana.

Vea CASO (Transact-SQL) (MSDN)

Respondido el 14 de enero de 17 a las 09:01

Ya hay muchas respuestas con respecto a CASE. Explicaré cuándo y cómo usar CASE.

Puede utilizar expresiones CASE en cualquier lugar de las consultas SQL. Las expresiones CASE se pueden usar dentro de la instrucción SELECT, cláusulas WHERE, cláusula Order by, cláusulas HAVING, instrucciones Insert, UPDATE y DELETE.

Una expresión CASE tiene los dos formatos siguientes:

  1. Expresión CASE simple

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

    Esto compara una expresión con un conjunto de expresiones simples para encontrar el resultado. Esta expresión compara una expresión con la expresión de cada cláusula WHEN para determinar la equivalencia. Si la expresión de la cláusula WHEN coincide, se devolverá la expresión de la cláusula THEN.

    Aquí es donde cae la pregunta del OP. 22978 OR 23218 OR 23219 no obtendrá un valor igual a la expresión, es decir, ebv.db_no. Por eso está dando un error. Los tipos de datos de input_expression y cada when_expression deben ser iguales o deben ser una conversión implícita.

  2. Expresiones CASE buscadas

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

    Esta expresión evalúa un conjunto de expresiones booleanas para encontrar el resultado. Esta expresión permite operadores de comparación y operadores lógicos Y / O en cada expresión booleana.

Sentencia SELECT con expresiones 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

Declaración 2.Update con expresión 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 

3.Cláusula ORDENAR con expresiones 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 Cláusula con expresión 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 estos casos de uso ayuden a alguien en el futuro.

Source

Respondido el 14 de enero de 17 a las 14:01

Trata

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END

Respondido el 22 de Septiembre de 14 a las 09:09

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;

Respondido 13 Oct 15, 12:10

Votación a favor debido a la inclusión de un ELSE Sales campo, que devuelve el valor predeterminado si no se incluye dentro de una declaración de caso, apropiado para consultas comerciales. - FoxDeploy

select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

Respondido el 15 de enero de 18 a las 05:01

¿Por qué no explica qué se está haciendo aquí? Es importante dar respuestas completas con explicaciones, ya que algunos novatos pueden necesitar eso para comprender cómo esto resuelve el problema: Gerhard

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 = El nombre de la tabla en la que desea realizar la operación.

column_name = El nombre de la columna / campo cuyo valor desea establecer.

update_value = El valor que desea establecer column_name

Respondido el 15 de junio de 19 a las 10:06

Si bien este código puede resolver el problema del OP, algunas palabras de explicación serían aún más útiles para los futuros lectores. - Thom

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 

Respondido el 11 de Septiembre de 20 a las 22:09

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 

respondido 30 nov., 16:20

Esta respuesta parece que no tiene nada que ver con la pregunta. - LarsTech

No publique código desnudo, también proporcione una explicación de lo que está haciendo su código. - jonathan mee

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.