我已经建立了一个界面,用户从数据库中获取记录。用户可以选择指定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进行Anded,而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 - 建立动态的不失败where子句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10992268/

10-12 19:57