【问题标题】:SQL: Ternary operationsSQL:三元运算
【发布时间】:2012-01-27 06:07:16
【问题描述】:

在 C++ 中,您可以这样做:

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 而不使用存储的过程或触发器来做同样的事情?

【问题讨论】:

标签: mysql sql


【解决方案1】:

使用CASE 语句:

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

【讨论】:

  • 分号语句终止符在这里有效吗?
  • @onedaywhen 你是对的。我已经删除了它,因为它是一个片段而不是一个完整的陈述。
【解决方案2】:

是的,有可能,看看documentation,上面写着:

IF(expr1,expr2,expr3)

如果 expr1 为 TRUE(expr1 0 且 expr1 NULL),则 IF() 返回 expr2;否则返回 expr3。

这个未经测试的代码应该是你的情况:

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

【讨论】:

  • 似乎文档有误,因为 (expr1 &lt;&gt; 0 and expr1 &lt;&gt; NULL) 未知。
  • 这意味着可能像 IF(0,Yes,No) 或 IF(NULL,Yes,No) 这样的语句都会返回 No
【解决方案3】:
IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

查看本手册了解详情control-flow-functions

【讨论】:

    【解决方案4】:

    简化:

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

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2018-09-10
      • 1970-01-01
      相关资源
      最近更新 更多