2013-02-19 74 views
2

這是在MySQL(5.1.41 - 社區)中的錯誤 -IF(a.testcol IS NULL, '',a.testcol)IS NOT NULL不起作用

CREATE TEMPORARY TABLE zztest (stuff varchar(20) NULL) 

INSERT INTO zztest 
SELECT 
    'test' 
FROM (
    select '1' as testcol 
    union 
    select null 
) a 
WHERE **IF(a.testcol IS NULL,'',a.testcol)** IS NOT NULL 

這是一個簡化查詢。 **之間的IF表達應該是粗體的。它來自動態查詢,其中IF表達式被無辜地放入查詢中。

選擇本身的作品。與插入語句結合使用時,它不起作用。內部選擇旨在顯示創建的臨時表在被檢查的列中可以具有空值。

這件事是通過用IFNULL代替IF(a.testool, '')

其他一些replacesments失敗過(而自己的選擇工作) 「固定」:

1 IF (a.testcol, '', a.testcol) 
2 IF (a.testcol, '', '') 
3 IF ('', '', '') 

這個錯誤是否存在於其他版本的MySQL中?

編輯 - 與選擇查詢的結果:

消息:錯誤代碼:1292截斷不正確INTEGER值:「」

它應該具有的結果是兩個「測試」字符串輸入到zztest表中。

編輯 - 約2小時後我再次嘗試了。最後兩條語句「工作」(記住將它們插入上面的查詢中)。第一個替換聲明失敗。然後數字2和三再次失敗。

因此,它看起來像語句1是罪魁禍首(和原來的,它錯誤了現在..)..也許某種壞的狀態存在的地方,產生相同中間結果的語句也失敗。

因此,後續問題是 - 有沒有辦法確保查詢被重置?

就在我嘗試在新連接中執行查詢後,工作臺崩潰了..相關?

編輯 - 發現,有明確的轉換工作:

IF (a.testcol, cast('' as char), cast('' as char)) 

所以我發現我周圍的路。問題是 - 爲什麼「(將引號內的任何內容)解釋爲INTEGER?我甚至通過連接''將它解釋爲DOUBLE。

它爲什麼有時會工作,而不是其他人? < - 這部分吸吮的女僕。

+2

它不起作用?會發生什麼,會發生什麼? – nos 2013-02-19 18:53:11

回答

2

此:

IF(a.testcol IS NULL,'',a.testcol) 

永遠不會成爲空的,你的病情:

WHERE IF(a.testcol IS NULL,'',a.testcol) IS NOT NULL 

總是會返回所有行。


當testcol爲null你分配空字符串給它:''

空字符串是NULL指出錯誤,這是不是一個錯誤

你應該使用這樣的事情:

SELECT testcol FROM 
(
    SELECT '1' AS testcol 
    UNION 
    SELECT null 
) a 

WHERE IF(a.testcol IS NULL, NULL ,a.testcol) IS NOT NULL 

或:

SELECT testcol FROM 
(
    SELECT '1' AS testcol 
    UNION 
    SELECT null 
) a 

WHERE ISNULL(a.testcol) = true 

ISNULL剛剛返回 「真」 時,參數爲空。

+0

'ISNULL(a.testcol)= true'不是MySQL ...是嗎?你不能只是做'WHERE a.testcol IS NULL'嗎? – 2013-02-19 22:55:37

+0

@RocketHazmat ISNULL在MySQL中工作,你可以使用IS NULL,但我想告訴他爲什麼他的IF不起作用,我不知道他是如何使用它(我假設他向我們展示了非常簡化的代碼)。 – Kamil 2013-02-19 23:07:54

+0

我不知道'ISNULL'。但是,那麼它不會是'WHERE ISNULL(a.testcol)'嗎?我不認爲MySQL有'true' /'false'關鍵字。 – 2013-02-19 23:11:48