java - COALESCE 的所有参数都为空时的替代方案
问题描述
我正在开发一个 Web 应用程序(java-maven 项目),我使用的查询有问题。我的网络应用程序的 UI 有 2 个搜索字段:PTT
和ID
. 用户需要填写至少一个字段才能进行搜索。所以这两个字段都可以为空,但不能同时为空。以前,我只有一个字段:PTR
它显示大小为 52 的结果数组。(如果我执行,也会得到相同的数字select * from users where ptr='smthing'
)。之后,我添加了ID
字段并更新了我的查询,如下所示:
我在我的网络服务中执行这个查询:
String query= "SELECT t.ptr, t.id ";
query+= "FROM users t ";
query+= "WHERE t.ptr = COALESCE(?, t.ptr) AND " ;
query+= "t.id = COALESCE(?, t.id) ";
并在 Prepared Statement 的帮助下设置字段。
现在,如果该ptr
字段已填充,但id
UI 上的字段为空白(这可以是 null 或空字符串)并且用户进行搜索,结果数组大小变为 30。我与数据库进行比较,它不会获取ID
为 null的行. 所以coalesce
当它的两个参数(?,t.ptr)都为空时,这不是我需要的。我该如何解决这个问题,有什么建议吗?
解决方案
我认为你想要的逻辑是:
WHERE (t.ptr = ? OR ? IS NULL) AND
(t.id = ? OR ? IS NULL)
我建议使用命名参数,因此您不必将它们传递两次。
推荐阅读
- javascript - res.map() 不是 res 是数组对象的函数
- parameters - 将参数传递给 qsub:括号问题
- python-3.x - 如何从 Tkinter 中的另一个类 __init__ 访问字典
- python - Python,浮点数可以有多长小数点?
- ios - 如果 selectedSegmentIndex 不同,则 ViewController 不同
- ruby-on-rails - 如何在 circleCI 中设置 ruby 版本?
- inno-setup - Inno Setup Unknown identifier - 这可能是语法错误吗
- linux - 如何从终端中的任何目录运行 linux 可执行文件?
- r - 计算几个点之间的行驶距离矩阵(使用osrm)
- java - 有没有办法不在Java中实现接口方法?