如何处理(可能)预准备语句中的空值?

2022-08-31 21:03:10

该语句是

SELECT * FROM tableA WHERE x = ?

参数通过 java.sql.PreparedStatement 'stmt' 插入

stmt.setString(1, y); // y may be null

如果 为 null,则该语句在每种情况下都不返回任何行,因为 始终为 false(应为 )。一个解决方案是yx = nullx IS NULL

SELECT * FROM tableA WHERE x = ? OR (x IS NULL AND ? IS NULL)

但是,我必须设置相同的参数两次。有没有更好的解决方案?

谢谢!


答案 1

我一直按照你在问题中展示的方式去做。设置相同的参数两次并不是一个巨大的困难,不是吗?

SELECT * FROM tableA WHERE x = ? OR (x IS NULL AND ? IS NULL);

答案 2

有一个非常未知的 ANSI-SQL 运算符来处理 NULL 值。它可以这样使用:IS DISTINCT FROM

SELECT * FROM tableA WHERE x NOT IS DISTINCT FROM ?

因此,只需设置一个参数。遗憾的是,MS SQL Server (2008) 不支持此功能。

另一种解决方案可能是,如果有一个值是并且永远不会被使用(“XXX”):

SELECT * FROM tableA WHERE COALESCE(x, 'XXX') = COALESCE(?, 'XXX')