Mysql 如何在'IF'表达式中使用用户定义的变量?
我的一些SQL语句如下所示: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,
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
如果您已经在使用这样的子查询,或者性能不是很关键,那么第二个选项可能有意义。谢谢。很高兴知道最大的功能。虽然意图不那么明显,但这是一个聪明的把戏。