2012-01-27 6 views
9

En C++, se puede hacer esto:SQL: Ternario operaciones

T.x = (T.y > 1 && (T.x - T.y < 0)) ? 0 : (T.x - T.y) 

que a [casi] llanura Inglés, es

if T.y > 1 and T.x-T.y < 0 then 
    set T.x to 0 
else 
    set T.x to T.x-T.y 

¿Es posible hacer lo mismo usando sólo SQL, sin usar procs o disparadores almacenados?

+0

véase: http: //dev.mysql .com/doc/refman/5.0/es/case-statement.html – diEcho

+0

Ver http: // sta ckoverflow.com/q/1647961/584420 –

Respuesta

11

Utilice la CASE declaración:

CASE WHEN T.y > 1 AND (T.x - T.y) < 0 THEN 0 ELSE (T.x - T.y) END 
+0

+1, mucho legible y la instrucción 'IF'. – lqez

+0

¿El terminador de instrucción de punto y coma es válido aquí? – onedaywhen

+0

@onedaywhen Estás en lo cierto. Lo eliminé, ya que es un fragmento en lugar de una declaración completa. –

0
IF search_condition THEN statement_list 
    [ELSEIF search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END IF 

Comprobar este manual para más detalles control-flow-functions

5

Sí, es posible, echar un vistazo a la documentation, que dice:

SI (expr1, expr2, expr3)

Si expr1 es TRUE (expr1 <> 0 y expr1 <> NULL), entonces IF() devuelve expr2 ; de lo contrario, devuelve expr3.

Este código no probado debe ser su caso:

SELECT IF(((T.y > 1) and (T.x-T.y < 0)), 0, (T.x-T.y)) 
+0

Parece que los documentos están equivocados porque '(expr1 <> 0 y expr1 <> NULL)' es UNKNOWN. – onedaywhen

+0

Significa probablemente una declaración como IF (0, Sí, No) o IF (NULL, Sí, No) ambos devolverán No – CloudyMarble

0

simplificado:

SELECT *, 
     CASE WHEN (y > 1 AND x < y) THEN 0 ELSE (x - y) END AS result 
FROM T;