2012-05-08 26 views
7

Quiero comparar dos números. Echemos es decir, 1 y 2.Oracle: ¿Cómo puedo obtener un valor 'VERDADERO' o 'FALSO' al comparar dos NÚMEROS en una consulta?

He tratado de escribir la siguiente consulta pero simplemente no funciona como se esperaba (sapo dice: ORA-00923: No se ha encontrado la palabra clave FROM en espera):

SELECT 1 > 2 from dual 

El DECODE es algo así como un caso de interruptor, entonces ¿cómo puedo obtener el resultado de una evaluación de expresión (es decir, una comparación numérica) poniéndolo en la lista de selección?

Me han encontrado una solución con un funciones en lugar de una expresión en la lista de selección: es decir,

select DECODE(SIGN(actual - target) 
      , -1, 'NO Bonus for you' 
      , 0,'Just made it' 
      , 1, 'Congrats, you are a winner') 
from some_table 

¿Existe una forma más elegante?

Además, ¿cómo puedo comparar dos fechas?

+1

he encontrado una solución mediante FUNCIONES lugar de expresión en la lista de selección: es decir, DECODE (SIGN (real-objetivo), -1, 'ninguna prima para usted', 0, 'acaba de hacer it ', 1,' Felicidades, eres un ganador '). ¿Hay una manera más elegante? Y cómo puedo comparar dos fechas – Revious

+1

Por favor edite su pregunta para incluir información relevante, en lugar de dejar un comentario. – APC

+0

Posible duplicado de [Oracle: comparación entre el número entero en la lista de selección] (http://stackoverflow.com/questions/10494955/oracle-comparison-between-integer-in-select-list) –

Respuesta

5

La función SIGN() es, de hecho, la mejor forma de clasificar (en) la igualdad que pueda interesarle si desea probar a> b, a = by a < b, y aceptará fecha-fecha o numérico-numérico como argumento.

Utilizaría una sentencia Case por preferencia, en lugar de una decodificación.

Select 
    case sign(actual-target) 
    when -1 then ... 
    when 0 then ... 
    when 1 then ... 
    end 
+4

Usar 'SIGN' para esto era necesario cuando todo lo que teníamos era' DECODE', pero con 'CASE', creo que solo hace que el código sea menos claro. Simplemente puede escribir la comparación: 'CASO CUANDO a> b ENTONCES ... CUANDO a = b ENTONCES ... CUANDO a

+1

Posiblemente, en particular si la comparación es muy breve (a> b) ...Creo que SIGN() sería más útil si tuvieras una expresión larga y horrible con la que no quieres repetir (por ejemplo, para averiguar si algo estaba antes, después o después, luego el primer día de el año fiscal, que puede ser un poco difícil) o alguna función costosa para llamar para evaluar la expresión. –

7

No hay tipos booleanos en sql (al menos en Oracle).
puede utilizar case:

SELECT CASE when 1 > 2 THEN 1 ELSE 0 END FROM dual 

Pero su solución (recepción) también es bueno, leer here

+0

El estándar SQL * does * define a tipo de datos booleano, pero, como mencionó correctamente, Oracle SQL no lo admite (a diferencia de otros DBMS). Dentro de un procedimiento PL/SQL, puede definir variables booleanas. –

1

se puede comparar dos fechas con SQL

método (1):

SELECT TO_DATE('01/01/2012') - TO_DATE('01/01/2012') 
FROM DUAL--gives zero 

MÉTODO (2):

SELECT CASE 

when MONTHS_BETWEEN('01/01/2012','01/01/2010') > 0 
THEN 'FIRST IS GREATER' 
ELSE 'SECOND IS GREATER OR EQUAL' END 

FROM dual 

lo siento no puedo formatear el código que desapareció la barra de herramientas de formato! ¿Alguien sabe por qué?

1
SELECT (CASE 
WHEN (SIGN(actual - target) > 0) THEN 
'NO Bonus for you' 
ELSE 
'Just made it' END) 
FROM dual 
Cuestiones relacionadas