mysql - 构建一个动态的 no-fail where 子句

标签 mysql sql where-clause boolean-logic relational-algebra

我构建了一个界面,用户可以在其中从数据库中获取记录。用户可以选择指定 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/

相关文章:

java - ResultSetImpl.checkColumnBounds 或 ResultSetImpl.getStringInternal 中偶尔出现 NullPointerException

Mysql:为相同的ID查找更高的值

MySQL - 根据值分配数字

php - CakePHP:无法识别 hasMany 关联

mysql - 如何解决 MySQL Left WHERE 条件错误?

php - 即使值不存在于 where 子句中也得到返回

c# - 复杂的 Linq-to-SQL where 条件帮助

c# - 使用 C# 与 ASPX 网站的 MYSQL 数据库连接

mysql - 如何对重复的 mysql 数据进行非规范化?

SQL - 数据透视表和组不工作