从结果中排除 NULL 值

NULL values are excluded from results

提问人:Nilesh 提问时间:10/28/2023 最后编辑:Thom ANilesh 更新时间:10/29/2023 访问量:86

问:

我的一个代码功能要求用户为SQL查询输入动态“WHERE”子句。
然后将此 where 子句附加到 sql 并使用 Spring Boot - JDBC 模板在 MS Sql 服务器上执行。 例如 如果存在非 Null 值,则此代码效果很好,但它会跳过国家/地区列中具有 NULL 值的行。
SELECT * From Customer_Vehicles where Country in ( 'USA', 'Canada');

根据 MS Sql 文档,它会跳过 NULL 值,因为 ANSI_NULLS 在 jdbc 连接(默认属性)中为 ON。 因此,我尝试使用jdbc模板执行方法使用命令“SET ANSI_NULLS OFF”设置属性。

jdbctemplate.execute ("SET ANSI_NULLS OFF")
jdbctemplate.query("SELECT * From Customer_Vehicles where Country in ( 'USA', 'Canada')");

此解决方案适用于字符串比较,但不适用于里程< 25000 等数值 例如 如果里程为 NULL,则不返回行。
MS文档中对此进行了相同的解释:https://learn.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-ver16
SELECT * From Customer_Vehicles where Country in ( 'USA', 'Canada') and mileage < 25000

有没有办法在比较中包含 NULL 值(无论数据类型如何)?

注意:用户可以使用 ISNULL 函数,但用户不愿意修改他们在旧版应用程序中使用的 WHERE 子句集。

java sql sql-server jdbctemplate ansi-nulls

评论

0赞 Jonas Metzler 10/28/2023
为什么不简单地写和?我不明白你问题的最后一句话。但我不明白为什么有人必须手动输入这个。您的应用程序只需在代码中添加条件,因此没有人需要输入此条件。...OR Country IS NULL...OR mileage IS NULLOR column IS NULL
0赞 Abra 10/28/2023
您写道(在您的问题中):旧版应用程序中使用的 WHERE 子句 旧版应用程序中是否没有发生空值的相同问题?我会要求用户使用 ISNULL 函数。
3赞 Thom A 10/28/2023
关闭是个坏主意。Microsoft 计划删除该功能以在某个时候将其完全关闭;不要再依赖这种行为了。ANSI_NULLS
0赞 siggemannen 10/28/2023
为什么它不应该跳过空行。它们与条件不符
0赞 Samuel Marchant 10/28/2023
也许是 WHERE ((mileage < 25000) 或 (milage=NULL))。不完全确定。其中里程为 NULL 或里程 < 25000

答:

1赞 Charlieface 10/29/2023 #1

与其乱搞(由于与较新功能(如索引视图和)的兼容性问题,永远不应该这样做,而只需向查询添加一个条件以包含 null。ANSI_NULLSMERGE

SELECT cv.*
FROM Customer_Vehicles cv
WHERE (cv.Country in ('USA', 'Canada') OR cv.Country IS NULL)
  AND (cv.mileage < 25000 OR cv.mileage IS NULL);