2012-01-27 93 views
9

在C++中,你可以這樣做:SQL:三元操作

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

這在[近]簡單的英語,是

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 

是否有可能做的只使用SQL同樣的事情,沒有使用存儲的特效或觸發器?

+0

看到:HTTP://dev.mysql .com/doc/refman/5.0/en/case-statement.html – diEcho 2012-01-27 06:11:04

+0

請參閱http:// sta ckoverflow.com/q/1647961/584420 – 2012-01-27 06:36:35

回答

11

使用CASE聲明:

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

+1,那麼'IF'語句就可讀。 – lqez 2012-01-27 06:15:43

+0

分號語句終止符在這裏有效嗎? – onedaywhen 2012-01-27 07:02:23

+0

@onedaywhen你是對的。我刪除了它,因爲它是一個片段而不是完整的聲明。 – 2012-01-27 07:03:01

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

檢查本手冊的細節control-flow-functions

5

是其可能的話,看看documentation,它說:

IF(表達式1,表達式2,表達式3)

如果expr1爲真(expr1 <> 0且expr1 <> NULL),則IF()返回 expr2 ;否則它返回expr3。

這個未經測試的代碼應該是你的情況:

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

似乎文檔是錯誤的,因爲'(expr1 <> 0和expr1 <> NULL)'是UNKNOWN。 – onedaywhen 2012-01-27 07:00:59

+0

這意味着IF(0,是,否)或IF(NULL,是,否)這樣的語句可能會返回否 – CloudyMarble 2012-01-27 07:46:46

0

簡化:

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