我有这个查询:
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。如何使返回"NONE"而不是 NULL?
我忽略了解释一个重要的观点: usaf
和 wban
是stored procedure
的IN
变量。这是我的最终(工作)版本。谢谢罗兰多
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
由于 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
?
在 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 部分中
其次,使其成为左连接,以适应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);
试一试!!