2015-03-02 60 views
1

雖然試圖做一個選擇查詢使用isnull其中,我已經嘗試在2個不同的服務器是相同的一個到另一個。 (他們都使用相同的程序,DLL,返回頁面,他們只是改變從一個IP到另一個)SQL isnull錯誤

SELECT * FROM 
ITEM_TEST 
WHERE ITEM_NAME = isnull(@ITEM_TESTE, ITEM_NAME) 

的操作工作,而不在服務器中的一個問題,返回所有選項時@ITEM_TESTE是NULL,而在另一箇中,它只返回那些不是NULL的。 我正在使用名爲SQLdbx(版本3.14)的基於sybase的應用程序(版本12.5)

不是那麼公開地理解它,@ITEM_TESTE是從用戶給出的變量,它是可選的,這意味着它可以爲null ITEM_NAME接受STRING,ITEM_TEST也是一個包含10個以上變量的表,我正在簡化它。然而,此搜索要求所有可能的結果,即使ITEM_NAME未被使用,同時使用其他變量縮小搜索範圍也是如此。 (我想到了創建與排除ITEM_NAME的IF條件的搜索和它的工作,但它使搜索以「laggy」由於性能比較的問題。)

編輯

變化的變量的名稱使它不那麼容易混淆(同名),並添加了解釋以便於理解

另外,由於版權問題,我無法在此發佈確切的代碼。

回答

1

這是您的where條款:

WHERE ITEM_TESTE = isnull(@ITEM_TESTE, ITEM_TESTE) 

ITEM_TESTENULL,因爲NULL = NULL評估在SQL世界不是真的這where子句將永遠是真實的。

想必,你想:

WHERE (ITEM_TEST = @ITEM_TESTE OR @ITEM_TESTE IS NULL) 
+0

我試過了,但結果是相同的isnull操作,它只返回非空變量,同時,當ITEM_TESTE =變量時,由於ITEM_TESTE = NULL,WHERE子句可以爲true並且我正在尋找NULL有效的可能性 – Gui 2015-03-02 20:09:04

+0

@ user4624894。 。 。在數據庫中,幾乎所有與'NULL'的比較都不是真的,除了'null'。因此,重複一次,WHERE ITEM_TESTE = NULL將返回* nothing *,因爲與NULL的相等性從來就不是真的。 – 2015-03-02 20:14:35

+0

當我寫到那裏時,我錯過了一件事... isnull函數不存在與相同的寫入來停止NULL返回?我的意思是 isnull(@ITEM_TESTE,ITEM_TESTE)會停止函數爲@ITEM_TESTE,以防他爲空,返回ITEM_TESTE,不是嗎? – Gui 2015-03-02 20:18:05

0

有人解釋給我,畢竟這些年來已經永遠堅持的方式,是空是不是什麼,它是未知,所以你不能使用平等檢查來驗證兩件你一無所知的東西同樣沒有任何意義。 IS正在檢查它們是否在相同的未知的狀態,這與值無關。

正如其他人所說= NULL將永遠不會工作,因爲=意味着價值比較。

+0

我知道,但事實並非如此嗎?我的意思是,如果信息是空的,對我們來說是未知的,在這種情況下是可以的,因爲我們不需要知道的信息,我需要的是,即使我們不知道它的價值。 – Gui 2015-03-02 20:45:14