2012-01-27 75 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;