2012-12-19 14 views
3

我有這個疑問:這個簡單的COALESCE選擇查詢有什麼問題? (MySQL的)

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?

我忘了說明一個重要的觀點: 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 
+0

如果您在sqlfiddle上發佈您的模式和查詢將會很有幫助 - 幫助我們幫助您 – povilasp

回答

1

供應WHERE子句

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子句元素融入ON的部分JOIN

其次,使之成爲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); 

試試看!

3

查詢從來沒有考慮,因爲where條款的美國空軍和WBAN的NULL值:

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

當這些字段都是NULL,則該行被過濾掉。這對於重言式a.usaf = a.usaf甚至是如此。當a.usaf爲NULL時,該語句返回FALSE(well,NULL)。

刪除where子句,查詢可能會按照您的預期工作。

作爲第二條評論。 。 。你想要一個inner join還是一個left outer join