2012-02-27 7 views
15

Estoy buscando una manera de construir sentencias de casos en una consulta de selección sql utilizando menos que y mayores que los signos. Por ejemplo, quiero seleccionar una clasificación basada en una variable:Usar signos de comparación dentro de una declaración de caso sql

DECLARE @a INT 
SET @a = 0 

SELECT CASE 
     WHEN @a < 3 THEN 0 
     WHEN @a = 3 THEN 1 
     WHEN @a > 3 THEN 2 
     END 

me gustaría escribir como:

DECLARE @a INT 
SET @a = 0 

SELECT CASE @a 
     WHEN < 3 THEN 0 
     WHEN 3 THEN 1 
     WHEN > 3 THEN 2 
     END 

... pero SQL no me deja utilizar el < y> signos de esta manera. ¿Hay alguna manera de que pueda hacer esto es SQL 2005, o necesito usar el código como en el primero?

La razón por la que solo deseo el código allí una vez es porque haría que el código fuera mucho más legible/mantenible y también porque no estoy seguro de si SQL Server tendrá que ejecutar el cálculo para cada sentencia CASE.

Busco una declaración de caso equivelent VB.NET:

Select Case i 
    Case Is < 100 
     p = 1 
    Case Is >= 100 
     p = 2 
End Select 

Tal vez no es posible en SQL y eso está bien, sólo quiero confirmar que.

+2

El 'CASE' está trabajando como CASE o el interruptor en la mayoría de lenguajes de programación. No veo el punto de tu necesidad. –

+0

Disculpe, el final de mi pregunta fue interrumpido. Avísame si aún no entiendes lo que intento lograr – Greg

+0

La expresión CASE provocará un cortocircuito y evaluará los casos solo hasta que uno de los casos sea verdadero y lo haga. No creo que haya ninguna ventaja en otro enfoque. –

Respuesta

19

Puede utilizar la función SIGN como

DECLARE @a INT 
SET @a = 0 

SELECT CASE SIGN(@a - 3) 
     WHEN -1 THEN 0 
     WHEN 0 THEN 1 
     WHEN 1 THEN 2 
     END 

Si @a es menor que 3, entonces @a - 3 resultados en un int negativo, en el que vuelve SIGN -1.

Si @a es 3 o mayor, entonces SIGN devuelve 0 o 1, respectivamente.


Si la salida que desea es 0, 1 y 2, entonces se puede simplificar aún más:

DECLARE @a INT 
SET @a = 0 

SELECT SIGN(@a - 3) + 1 
+0

Gracias, voy a probar – Greg

+0

No veo cómo es más fácil de mantener. Cualquiera que conozca SQl encontrará la declaración original que a la OP no le gustó pero que funciona para ser más clara. – HLGEM

+0

@HLGEM También estoy de acuerdo con usted si '@ a' fuera simplemente una expresión simple, pero según OP,' @ a' es una expresión larga y complicada que no quiere que se repita tres veces en una declaración de caso. Entonces, supongo que mi solución o la de Andriy M son apropiadas para resolver su problema. –

6

Usando SIGN como suggested by @Jose Rui Santos parece una buena solución. Una alternativa podría ser asignar la expresión un alias, utilice una subselección y poner a prueba la expresión (usando su alias) en el exterior seleccione:

SELECT 
    …, 
    CASE 
    WHEN expr < 3 THEN … 
    WHEN expr > 3 THEN … 
    END AS … 
FROM (
    SELECT 
    …, 
    a complex expression AS expr 
    FROM … 
    … 
) 
1
SELECT 
CASE 
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail' 
WHEN ColumnName >=6 THEN 'Pass' 
ELSE 'Test' 
END 
FROM TableName 
+0

la pregunta original era cómo obtengo la condición para que no aparezca en todas las líneas. Esto en realidad no responde a la pregunta ya que aún tendría que repetir la ecuación en 2 de las líneas y asumir el else – Greg

+0

No puedo dejar de votar esto porque no necesariamente resuelve la pregunta original, pero resolvió mi problema. Gracias. Solo necesitaba mover el Nombre de Columna de la línea "CASO" a cada una de las líneas "CUANDO". – Ads

Cuestiones relacionadas