Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在'IF'表达式中使用用户定义的变量?_Mysql_Sql - Fatal编程技术网

Mysql 如何在'IF'表达式中使用用户定义的变量?

Mysql 如何在'IF'表达式中使用用户定义的变量?,mysql,sql,Mysql,Sql,我的一些SQL语句如下所示: IF(timediff(a.wo_finish_time, IF(a.wo_failure_time <> '0000-00-00 00:00:00', a.wo_failure_time, a.wo_creation_time)) < 0, 0, timediff(a.wo_finish_time,

我的一些SQL语句如下所示:

  IF(timediff(a.wo_finish_time,
               IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                  a.wo_failure_time,
                  a.wo_creation_time)) < 0,
      0,
      timediff(a.wo_finish_time,
               IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                  a.wo_failure_time,
                  a.wo_creation_time)))
正如您所看到的,它是冗长的,因为它的一部分出现了两次。所以我尝试了如下用户定义变量:

 if(@down_time := timediff(a.wo_finish_time,
                             IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                                a.wo_failure_time,
                                a.wo_creation_time)) < 0,
      0,
      @down_time)
SELECT
    CASE WHEN t.col < 0 THEN 0 ELSE t.col END AS col
FROM
(
    SELECT TIMEDIFF(a.wo_finish_time,
           IF(a.wo_failure_time <> '0000-00-00 00:00:00',
              a.wo_failure_time,
              a.wo_creation_time)) AS col
           -- other columns?
    FROM yourTable
) t

可能是由于变量范围的不同,它不起作用。我知道我可以将这个@down_时间变量声明放在选择列表中,但这也会将它添加到输出列中。我想一定有更好的方法,所以我发布了这个问题,希望找到更好的方法。

你可以使用以下最棒的技巧:

不需要动态SQL的另一种解决方法是包装当前查询,然后子查询出正确的值,如下所示:

 if(@down_time := timediff(a.wo_finish_time,
                             IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                                a.wo_failure_time,
                                a.wo_creation_time)) < 0,
      0,
      @down_time)
SELECT
    CASE WHEN t.col < 0 THEN 0 ELSE t.col END AS col
FROM
(
    SELECT TIMEDIFF(a.wo_finish_time,
           IF(a.wo_failure_time <> '0000-00-00 00:00:00',
              a.wo_failure_time,
              a.wo_creation_time)) AS col
           -- other columns?
    FROM yourTable
) t
如果您已经在使用这样的子查询,或者性能不是很关键,那么第二个选项可能有意义。

谢谢。很高兴知道最大的功能。虽然意图不那么明显,但这是一个聪明的把戏。