2015-11-03 92 views
0

我有這個非常簡單的MySQL查詢:MySQL的函數COALESCE未能返回非空值

SELECT m.REF_DATA_ID, COALESCE(m.SQL_FUNCTION, m.PHP_FUNCTION) AS FUNCTION FROM AAB_REFERENCE_DATA_MANAGER m; 

返回下面的數據:

REF_DATA_ID | FUNCTION 
88295  | 
88296  | 
88297  | 
88298  | now() 
88299  | 
88300  | now() 
88301  | 

COALESCE()似乎並沒有被正常在我的查詢出於某些原因,當我運行下面的查詢:

SELECT m.REF_DATA_ID, m.SQL_FUNCTION, m.PHP_FUNCTION FROM AAB_REFERENCE_DATA_MANAGER m; 

回報:

REF_DATA_ID SQL_FUNCTION PHP_FUNCTION 
88295  |    | 
88296  |    | 
88297  |    | 
88298  | now()  | 
88299  |    | get_session_user_id 
88300  | now()  | 
88301  |    | get_session_user_id 

我只是不知道我在做什麼錯COALESCE在這裏...

我在尋找的輸出是:

REF_DATA_ID FUNCTION 
88295  |   
88296  |   
88297  |   
88298  | now() 
88299  | get_session_user_id 
88300  | now() 
88301  | get_session_user_id 
+0

什麼是源功能列中的數據 - 空字符串或NULL? –

+1

看起來像你可能擁有它。謝謝Shree - 我相信它是一個空字符串...將運行更新查詢,看看是否它。 – Jeff

+0

Emptystring與空值不同。是的,'Coalesce'返回空字符串。 – RubahMalam

回答

1

一個空字符串不是NULL (Oracle除外)。因此,要更加明確與比較:

SELECT m.REF_DATA_ID, 
     (CASE WHEN m.SQL_FUNCTION IS NULL OR 
        TRIM(m.SQL_FUNCTION) = '' 
      THEN m.PHP_FUNCTION 
      ELSE m.SQL_FUNCTION 
     END) AS FUNCTION 
FROM AAB_REFERENCE_DATA_MANAGER m; 
+0

「(Oracle除外)」 - 這是我平常的操場。感謝大家的幫助。 – Jeff

+0

感謝您的幫助,雖然這工作,我傾向於修復數據的心態,並使其實際上空加入反對編寫邏輯來解釋參考數據的破碎。畢竟,我可能傾向於同意空字符串不是空值。 – Jeff

0
SELECT m.REF_DATA_ID, 
      COALESCE(If(Length(m.SQL_FUNCTION)=0, NULL, m.SQL_FUNCTION), 
        If(Length(m.PHP_FUNCTION)=0, NULL, m.PHP_FUNCTION)) AS FUNCTION 
    FROM AAB_REFERENCE_DATA_MANAGER m;