3

我有这个查询:

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 时,我希望查询用“NONE”来合并 null 结果,但是我仍然得到 NULL。我将如何使它返回“NONE”而不是 NULL?

我忽略了解释一个重要的点: usaf并且wbanINa 的变量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
4

2 回答 2

3

由于以下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

于 2012-12-19T16:02:23.587 回答
1

在 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);

试试看 !!!

于 2012-12-19T16:08:37.247 回答