2015-03-02 61 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