2012-01-27 14 views
9

In C++, si può fare questo:SQL: ternario operazioni

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

che a [quasi] parole povere, è

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 

E 'possibile fare la stessa cosa utilizzando solo SQL, senza usare proc o trigger memorizzati

+0

vedi: http: //dev.mysql .com/doc/refman/5.0/it/case-statement.html – diEcho

+0

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

risposta

11

Utilizzare il CASE dichiarazione:

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

+1, molto leggibile quindi l'istruzione 'IF'. – lqez

+0

Il terminatore dell'istruzione punto e virgola è valido qui? – onedaywhen

+0

@onedayquando hai ragione. L'ho rimosso, poiché è un frammento piuttosto che un'istruzione completa. –

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

Controllare questo manuale per i dettagli control-flow-functions

5

Sì, è possibile, date un'occhiata al documentation, si dice:

IF (expr1, expr2, expr3)

Se expr1 è TRUE (expr1 <> 0 ed expr1 <> NULL) IF() restituisce expr2 ; altrimenti restituisce expr3.

Questo codice non testato dovrebbe essere il vostro caso:

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

Sembra che i documenti siano errati perché '(expr1 <> 0 ed expr1 <> NULL)' è UNKNOWN. – onedaywhen

+0

Significa che probabilmente un'istruzione come IF (0, Sì, No) o IF (NULL, Sì, No) restituirebbe entrambi No – CloudyMarble

0

semplificata:

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