Mysql 查询以获取';大于零的不为空

Mysql 查询以获取';大于零的不为空,mysql,Mysql,我有一个问题: SELECT taskDeadline, subtasksDeadline, REPLACE( LEAST( COALESCE(t.deadline, 2147483647), COALESCE(sub.deadline, 2147483647) ), 2147483647, NULL ) AS Deadline FROM tasks t LEFT OU

我有一个问题:

SELECT
    taskDeadline,
    subtasksDeadline,
    REPLACE(
        LEAST(
            COALESCE(t.deadline, 2147483647),
            COALESCE(sub.deadline, 2147483647)
        ), 2147483647, NULL
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id
这会产生如下结果:

taskDeadline | subtasksDeadline | Deadline
1338501600   | 1333058400       | 1333058400
1334268000   | NULL             | 1334268000
NULL         | 1328050800       | 1328050800
NULL         | NULL             | NULL
1353798000   | 0                | 0
0            | 1353798000       | 0

我快到了。我使用2147483647作为数据类型(Mysql INT)的最大值,唯一的问题是,如果我有两个值,其中一个值为0,那么我想要得到另一个值。我已经花了一些时间,但无法到达那里。有人能解释一下吗?

如果我理解正确,您不希望
t.deadline
sub.deadline
的值为零,如果零是最小值。所以您可以将0转换为NULL,这将从
COALESCE

SELECT
    taskDeadline,
    subtasksDeadline,
    REPLACE(
        LEAST(
            COALESCE(IF(t.deadline = 0, NULL, t.deadline), 2147483647),
            COALESCE(IF(sub.deadline = 0, NULL, sub.deadline), 2147483647)
        ), 2147483647, NULL
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id

如果我理解正确,您不希望
t.deadline
sub.deadline
的值为零(如果零是最小值)。所以您可以将0转换为NULL,这将从
COALESCE

SELECT
    taskDeadline,
    subtasksDeadline,
    REPLACE(
        LEAST(
            COALESCE(IF(t.deadline = 0, NULL, t.deadline), 2147483647),
            COALESCE(IF(sub.deadline = 0, NULL, sub.deadline), 2147483647)
        ), 2147483647, NULL
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id

为什么不使用案例陈述

SELECT
    taskDeadline,
    subtasksDeadline,
    CASE
        WHEN t.deadline IS NULL AND sub.deadline IS NULL THEN NULL
        WHEN t.deadline IS NULL THEN sub.deadline
        WHEN sub.deadline IS NULL THEN t.deadline
        WHEN t.deadline > sub.deadline THEN sub.deadline
        WHEN sub.deadline > t.deadline THEN t.deadline
        WHEN sub.deadline = t.deadline THEN sub.deadline -- or this could be t.deadline
     END AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub 
        ON sub.task_id = t.id

为什么不使用案例陈述

SELECT
    taskDeadline,
    subtasksDeadline,
    CASE
        WHEN t.deadline IS NULL AND sub.deadline IS NULL THEN NULL
        WHEN t.deadline IS NULL THEN sub.deadline
        WHEN sub.deadline IS NULL THEN t.deadline
        WHEN t.deadline > sub.deadline THEN sub.deadline
        WHEN sub.deadline > t.deadline THEN t.deadline
        WHEN sub.deadline = t.deadline THEN sub.deadline -- or this could be t.deadline
     END AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub 
        ON sub.task_id = t.id

尝试使用此查询-

SELECT
    taskDeadline,
    subtasksDeadline,
    LEAST(
      IF(t.deadline = 0 OR t.deadline IS NULL, sub.deadline, t.deadline),
      IF(sub.deadline = 0 OR sub.deadline IS NULL, t.deadline, sub.deadline)
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id

尝试使用此查询-

SELECT
    taskDeadline,
    subtasksDeadline,
    LEAST(
      IF(t.deadline = 0 OR t.deadline IS NULL, sub.deadline, t.deadline),
      IF(sub.deadline = 0 OR sub.deadline IS NULL, t.deadline, sub.deadline)
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id

或者只是将NULLIF添加到现有合并中-

SELECT
    taskDeadline,
    subtasksDeadline,
    NULLIF(
        LEAST(
            COALESCE(NULLIF(t.deadline, 0), 2147483647),
            COALESCE(NULLIF(sub.deadline, 0), 2147483647)
        ), 2147483647
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id

或者只是将NULLIF添加到现有合并中-

SELECT
    taskDeadline,
    subtasksDeadline,
    NULLIF(
        LEAST(
            COALESCE(NULLIF(t.deadline, 0), 2147483647),
            COALESCE(NULLIF(sub.deadline, 0), 2147483647)
        ), 2147483647
    ) AS Deadline
FROM
    tasks t
    LEFT OUTER JOIN subtasks sub ON sub.task_id = t.id

更多信息:我一直认为案例的速度会很慢。这就是我跳过此选项的原因。取决于数据集的大小。它完全满足了您解决这个特定问题的需要,而且可读性也更高。更多信息:我一直认为CASE什么时候会比较慢。这就是我跳过此选项的原因。取决于数据集的大小。它完全满足了您解决这个特定问题的需要,而且可读性更高。快速简单。我更喜欢这个解决方案。我不知道NULLIF,谢谢!又快又容易。我更喜欢这个解决方案。我不知道NULLIF,谢谢!