在高层次上,这听起来微不足道,但事实证明我已经挠头几个小时了。
情况:
我有表格T
,列a,b,c,d,e
。列a
保存一个字符串,而b,c,d,e
每个列保存一个布尔值。
我允许用户执行一种搜索,其中我提示用户输入a,b,c,d,e
值,并返回这些值都匹配的所有行。
在理想情况下,用户输入所有值(例如a="JavaScript"
、b="true"
、c="false"
、d="false"
、e="true"
),结果查询(在 Scala 中,引用运行 MySQL 的远程数据库)可能如下所示:
connection.createStatement().executeQuery("SELECT * FROM T
WHERE a = '" + a_input + "'
and b = " + b_input + "
and c = " + c_input + "
and d = " + d_input + "
and e = " + e_input + ";")
问题:
我为用户提供了"放松"约束的选项,因此a_input=">" 和b_input=">等......可能所有字段a,b,c,d,e都可以为空 (")如果省略某个字段,则不应影响生成的响应。换句话说,如果未输入c
,则结果可以包含c
为TRUE或FALSE的条目
问题:
如何编写一个查询来涵盖可能所有字段都可能为空、仅部分字段或无字段的情况?
只需动态构建WHERE
即可。不要总是搜索c = 'whatever'
,而是仅在用户为其提供了值时才在WHERE
中包含c
。
你可以使用
Select *
from table
where a in ('','othervalue','othervalue')
and b in ('','othervalue','morevalues')
等等.....这就像为每个字段使用 OR,即使它是空的,它也会匹配
这很棘手,因为数据库包含布尔值,但 parms 是字符串。胳膊总是空白的吗?"真"还是"假"?如果是这样,请尝试
(B_input=''
Or (b_input=''true' and b)
Or (b_input='false' and ((not b)))