这个简单的合并选择查询有什么问题?(mysql)
我有一个疑问:这个简单的合并选择查询有什么问题?(mysql),mysql,sql,select,coalesce,null-coalescing-operator,Mysql,Sql,Select,Coalesce,Null Coalescing Operator,我有一个疑问: 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时,我希望
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
我忘了解释一个重要的问题:
usaf
和wban
是存储过程中的变量。
这是我的最终(工作)版本。谢谢罗兰多
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
查询从不考虑usaf和wban的空值,因为where
子句:
WHERE A.usaf = usaf AND A.wban = wban;
当这些列为空时,将过滤掉该行。这甚至适用于同义反复a.usaf=a.usaf
。当a.usaf为NULL时,该语句返回FALSE(嗯,NULL)
删除where
子句,查询可能会按预期工作
作为第二点评论。您想要内部联接
还是左侧外部联接
?在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)个方面进一步改进连接
首先,将WHERE子句元素添加到连接的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);
试试看 如果您能在SQLFIDLE上发布您的模式和查询,这将非常有用-帮助我们帮助您