2012-01-27 11 views
9

W C++, można to zrobić:SQL: Ternary operacje

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

który w [prawie] zwykły angielski, jest

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 

Czy to możliwe, aby zrobić to samo przy użyciu tylko SQL, bez używania przechowywanych proc lub triggerów?

+0

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

+0

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

Odpowiedz

11

Użyj oświadczenie CASE:

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

+1, znacznie czytelniejsza niż instrukcja "IF". – lqez

+0

Czy terminator instrukcji średnika jest tutaj ważny? – onedaywhen

+0

@madeaywhen Masz rację. Usunąłem go, ponieważ jest to fragment, a nie pełne stwierdzenie. –

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

Sprawdź to podręcznik dla szczegółów control-flow-functions

5

Tak, to możliwe, warto zapoznać się z documentation, to mówi:

IF (wyr1, wyr2, wyrażenie3)

Jeśli wyrażenie1 ma wartość PRAWDA (wyrażeń1 <> 0 i wyrażeń1 <> NULL), wówczas funkcja IF() zwraca wyrażenie 2 ; w przeciwnym razie zwraca wyrażenie 3.

To niesprawdzone kod powinien być sprawa:

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

Wygląda na to, że dokumenty są błędne, ponieważ '(wyrażenie1 <> 0 i wyrażenie1 <> NULL)' jest NIEZNANE. – onedaywhen

+0

Oznacza to, że prawdopodobnie instrukcja taka jak IF (0, Yes, No) lub IF (NULL, Yes, No) zwróci numer – CloudyMarble

0

uproszczonej:

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