尝试使用isnull进行选择查询时,我尝试了2个不同的服务器,这些服务器彼此相同。 (它们都使用相同的程序,dll,返回页面,它们只是从一个ip更改为另一个)
SELECT * FROM
ITEM_TEST
WHERE ITEM_NAME = isnull(@ITEM_TESTE, ITEM_NAME)
操作在其中一个服务器中正常运行,当@ITEM_TESTE为NULL时返回所有选项,而在另一个服务器中,它仅返回NOT NULL的那些选项。 我正在使用一个名为SQLdbx(版本3.14)的基于sybase的应用程序(版本12.5)
案例不是那么公开理解,@ ITEM_TESTE是用户提供的变量是可选的,这意味着它可以在ITEM_NAME接受STRING的情况下为空,而ITEM_TEST也是一个超过10个表的选项变量,我正在简化它。但是,即使ITEM_NAME未使用其他变量来缩小搜索范围,此搜索也需要所有可能的结果。 (我考虑使用IF条件创建一个排除ITEM_NAME的搜索并且它有效,但由于性能问题,它使搜索变得“滞后”。)
修改
更改变量名称以减少混淆(使用相同名称)并添加解释以便于理解
此外,由于版权问题,我无法在此发布确切的代码。
答案 0 :(得分:1)
这是您的where
条款:
WHERE ITEM_TESTE = isnull(@ITEM_TESTE, ITEM_TESTE)
当where
为ITEM_TESTE
时,此NULL
子句永远不会为真,因为NULL = NULL
在SQL世界中的计算结果不正确。< / p>
据推测,你想要:
WHERE (ITEM_TEST = @ITEM_TESTE OR @ITEM_TESTE IS NULL)
答案 1 :(得分:0)
向我解释并且在这些年之后永远陷入困境的方式是NULL不是没有,它是未知,所以你不能使用平等检查以验证你不知道的两件事同样没什么。 IS 正在检查它们是否处于相同的未知状态,这与某个值无关。
正如其他人所说= NULL永远不会起作用,因为=意味着价值比较。