结果中排除 NULL 值

问题描述 投票:0回答:1

我的代码功能之一要求用户为 SQL 查询输入动态“WHERE”子句。
然后将此 where 子句附加到 sql 并使用 Spring Boot - JDBC 模板在 MS Sql 服务器上执行。 例如

SELECT * From Customer_Vehicles where Country in ( 'USA', 'Canada');
如果存在非 Null 值,此代码效果很好,但它会跳过国家/地区列中具有 NULL 值的行。

根据 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 e.g.

SELECT * From Customer_Vehicles where Country in ( 'USA', 'Canada') and mileage < 25000
如果里程为 NULL,则不返回行。
MS 文档中也有同样的解释:https://learn.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-ver16

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

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

java sql sql-server jdbctemplate ansi-nulls
1个回答
0
投票

不要乱搞

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);
© www.soinside.com 2019 - 2024. All rights reserved.