【问题标题】:What is wrong with this simple COALESCE select query? (mysql)这个简单的 COALESCE 选择查询有什么问题? (mysql)
【发布时间】:2012-12-19 15:54:56
【问题描述】:

我有这个问题:

SELECT
    COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
FROM
    `metadata`.`ISH-HISTORY_HASPOS` A
 INNER JOIN `metadata`.`Artificial` Ar ON (Ar.id = A.mergeId)
WHERE
    A.usaf = usaf
AND A.wban = wban;

当没有连接发生并且结果为 NULL 时,我希望查询将 null 结果与“NONE”合并,但我仍然得到 NULL。 我将如何使它返回“NONE”而不是 NULL?

我忽略了一个重点: usafwbanIN 变量到 stored procedure。 这是我的最终(工作)版本。谢谢罗兰多

BEGIN
SET @usaf = usaf;
SET @wban = wban;

SELECT
    COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
FROM
    `metadata`.`ISH-HISTORY_HASPOS` A
 INNER JOIN `metadata`.`Artificial` Ar ON (Ar.id = A.mergeId AND    A.usaf = @usaf AND A.wban = @wban)
LIMIT 1;

END

【问题讨论】:

  • 如果您在 sqlfiddle 上发布您的架构和查询会很有帮助 - 帮助我们帮助您

标签: mysql sql select coalesce null-coalescing-operator


【解决方案1】:

由于where 子句,查询从不考虑usaf 和wban 的NULL 值:

WHERE A.usaf = usaf AND A.wban = wban;

当这些列为 NULL 时,该行将被过滤掉。对于重言式a.usaf = a.usaf 来说也是如此。当 a.usaf 为 NULL 时,该语句返回 FALSE(嗯,NULL)。

删除where 子句,查询可能会按您的预期工作。

作为第二条评论。 . .你想要inner join 还是left outer join

【讨论】:

    【解决方案2】:

    在 WHERE 子句中提供 Ar 别名

    SELECT
        COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
    FROM
        `metadata`.`ISH-HISTORY_HASPOS` A
     INNER JOIN `metadata`.`Artificial` Ar ON (Ar.id = A.mergeId)
    WHERE
        A.usaf = Ar.usaf
    AND A.wban = Ar.wban;
    

    查看此查询,您可以通过三 (3) 种方式进一步改进 JOIN

    首先,将 WHERE 子句元素添加到 JOIN 的 ON 部分

    其次,使其成为 LEFT JOIN 以适应NULL 的情况

    SELECT
        COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
    FROM
        `metadata`.`ISH-HISTORY_HASPOS` A
        LEFT JOIN `metadata`.`Artificial` Ar
        ON (Ar.id = A.mergeId) AND A.usaf = Ar.usaf AND A.wban = Ar.wban;
    

    第三,添加这些索引

    ALTER TABLE `metadata`.`ISH-HISTORY_HASPOS` ADD INDEX (mergeId,usaf,wban);
    ALTER TABLE `metadata`.`Artificial` ADD INDEX (id,usaf,wban);
    

    试试看!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多