提问人:Nilesh 提问时间:10/28/2023 最后编辑:Thom ANilesh 更新时间:10/29/2023 访问量:86
从结果中排除 NULL 值
NULL values are excluded from results
问:
我的一个代码功能要求用户为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-ver16SELECT * From Customer_Vehicles where Country in ( 'USA', 'Canada') and mileage < 25000
有没有办法在比较中包含 NULL 值(无论数据类型如何)?
注意:用户可以使用 ISNULL 函数,但用户不愿意修改他们在旧版应用程序中使用的 WHERE 子句集。
答:
与其乱搞(由于与较新功能(如索引视图和)的兼容性问题,永远不应该这样做,而只需向查询添加一个条件以包含 null。ANSI_NULLS
MERGE
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);
评论
...OR Country IS NULL
...OR mileage IS NULL
OR column IS NULL
ANSI_NULLS