2010-02-19 16 views
9

¿Hay alguna forma en la que podamos especificar valores para una declaración de caso? La declaración de abajo no se ejecuta porque piensa que 53,57,82,83, etc. son columnas. ¿Hay algún problema ... busqué en Google, pero no encontré nada que diga que no se puede usar IN-when expression ...TSQL - Caso - ¿Valores en?

select 
x = 
case 
    when xvalue in ([52],[57],[82],[83]) 
     then "xvalue" 
    when yvalue in ([01],[02],[11]) 
     then "yvalue" 
    else 
     'NULL' 
    end 
from xyztable 
+0

¿Para qué versión de SQL Server, o es esto para Sybase? –

+0

La razón por la que utilicé los paréntesis es ... cuando uso la misma entrada IN en las tablas dinámicas ... MSDN me dice que use esto ... SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] DE (SELECT DaysToManufacture, StandardCost DE Production.Product) AS SourceTable PIVOT ( AVG (StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS tabla dinámica; –

+0

Esto es un poco antiguo, pero ... está usando corchetes con la tabla dinámica porque efectivamente está creando alias columnas con la instrucción IN – Pork

Respuesta

16

No coloque los paréntesis alrededor de los números.

+1

Votando la más antigua como respuesta :) –

3

Prueba esto:

select 
case 
    when xvalue in (52,57,82,83) 
     then "xvalue" 
    when yvalue in (01,02,11) 
     then "yvalue" 
    else 
     'NULL' 
    end as 'x' 

Si desea utilizar la x, que estoy asumiendo que va a ser una variable que se desea definir así:

DECLARE @x int

select 
@x = case 
    when xvalue in (52,57,82,83) 
     then "xvalue" 
    when yvalue in (01,02,11) 
     then "yvalue" 
    else 
     'NULL' 
    end 
+0

@Random: 'X =' es lo mismo que 'como x' –

+0

@Gabriel, no si quieres usarlo más tarde dentro de t-sql ... el' x = 'y' as x' simplemente nombrarán la columna correspondiente con ese nombre, mientras declaras que la variable te permite acceso directo desde dentro del mismo bloque t-sql ... –

+0

Que es lo que dije. 'x =' y 'as x' hacen lo mismo. Solo señalé que no había ninguna razón para creer que el OP quería usar una variable. Me parece que el póster solo quiere usar un alias, y 'x =' es lo mismo que 'como x' en ese caso. –

12

uso:

SELECT x = CASE 
      WHEN t.xvalue IN (52, 57, 82, 83) THEN 'xvalue' 
      WHEN t.yvalue IN (01, 02, 11) THEN 'yvalue' 
      ELSE NULL 
      END 
    FROM TABLE t 

Suponiendo desea que el valor de la columna, utilice:

SELECT x = CASE 
      WHEN t.xvalue IN (52, 57, 82, 83) THEN t.xvalue 
      WHEN t.yvalue IN (01, 02, 11) THEN t.yvalue 
      ELSE NULL 
      END 
    FROM TABLE t 

Se da cuenta de que si tanto xValue y yValue están en los grupos, sólo se mostrará el xValue?

+0

upvote para la respuesta correcta :) –

1

Claro, si xvalue es una columna numérica, simplemente elimine los corchetes. Entonces debería funcionar bien. Los corchetes indican al servidor de base de datos que algo es un objeto de base de datos, por lo tanto, elimínelos para que se traten como un literal.

1

En t-sql, [] los identificadores son para citar símbolos como nombres de columna; puede tener espacios y todo tipo de caracteres impares en los nombres de las columnas, si realmente lo desea. Use '' comillas para citar literales de cadena.

2

El motivo por el que su consulta no funciona es porque está escrito incorrectamente. Mira esto:

in ([01],[02],[11]) 

Poner [] alrededor de los valores significa que usted quiere que tratan como nombres de columna. Si elimina las comillas, entonces esa parte funcionará. También vea esto:

then "xvalue" 

necesita comillas simples aquí.

else 'NULL' 

Aquí, ¿desea que el valor sea nulo o la cadena "NULL"? La forma en que lo ha escrito, que será la cadena "NULL"

Para que sea más valor NULL, escribir así:

else NULL 

Aquí es todo de nuevo, escritas correctamente:

select  
x = 
case  
    when xvalue in (52,57,82,83)  
     then 'xvalue' 
    when yvalue in (01,02,11)  
     then 'yvalue' 
    else 'NULL' 
    end 
from xyztable