我构建了一个界面,用户可以在其中从数据库中获取记录。用户可以选择指定 0 个或多个过滤器。有四个过滤器 A、B、C、D(假设这些是某个表中的字段)
我的查询应该是这样的:
select * from table
where (A = v1 or B = v2 or C = v3) and D = v4
我正在尝试提供一种制定查询的方法,而当指定了特定过滤器时,它会被应用,如果没有,则会被忽略。但这应该适用于所有 16 个案例。
到目前为止我能想到的是这些方法:
select * from table
where (
(A = v1 and 1)
or (B = v2 and 1)
or (C = v3 and 1)
)
and D = v4
v1
或其他值在未指定时设置为 -1。因此,如果未指定它们,它们将被简单地忽略,因为随后将使用另一个过滤器(来自 A、B、C)。但是在没有指定 A、B 和 C 的情况下,这会失败。在这种情况下,false 与 D 相乘,并且不应用 D。
有没有办法为这种情况提供 where 子句?我也对这个问题的编程解决方案持开放态度,我在其中通过代码添加或不添加子句,但我更喜欢这种方式。而且我真的不想有很多 if-else 语句。
谢谢!
最佳答案
使用 case
构造怎么样
select *
from table
where (A = CASE WHEN v1 IS NOT NULL THEN v1 else '' END)
OR (B = CASE WHEN v2 IS NOT NULL THEN v2 else '' END)
OR (C = CASE WHEN v3 IS NOT NULL THEN v3 else '' END)
OR (CASE WHEN v1 is null and v2 is null and v3 is null then 1 else 0 end)
and D = v4
关于mysql - 构建一个动态的 no-fail where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10992268/