【问题标题】:if condition in where clause in MariaDBMariaDB 中 where 子句中的 if 条件
【发布时间】:2019-08-08 06:50:37
【问题描述】:

这些是我正在使用的 EMP_TABLE 中的主要 4 列。

EMP_NAME EMP_ID EMP_DEPT 加入日期

一般要求是仅获取 EMP_DEPT = 'HR' 记录。但是如果 EMP_DEPT = 'HR' 记录在表中不可用,则要求是从 EMP_TABLE 中获取 EMP_DEPT = 'DEV' 记录。优先考虑 HR 记录。

我知道可以使用内部查询或联合和计数来实现。但我想知道是否可以使用 IF 或 WHEN。我已经尝试了以下查询,但它似乎不起作用。

select * from EMP_TABLE where if(EMP_DEPT='HR',EMP_DEPT='HR',EMP_DEPT='DEV');

对此的任何帮助表示赞赏。

【问题讨论】:

  • 如果没有hr记录,员工是否总是有dev记录,员工可以有多少条记录?
  • 是的。如果没有 HR 记录,员工可以有 DEV 记录。

标签: mysql sql if-statement mariadb case


【解决方案1】:

你想这样做:

select e.*
from EMP_TABLE e
where (emp_dept = 'HR') or
      (emp_dept = 'DEV' and 
       not exists (select 1 from emp_table e2 where e2.emp_dept = 'HR')
      );

第一个条件返回带有'HR' 的所有行。然后第二个返回'DEV',但仅当没有'HR' 记录时。

你真的不想使用(甚至学习)if()。它是一个 MySQL 扩展。条件表达式的标准是case

然后,您不想在where 子句中包含条件表达式。首先,它阻碍了优化。其次,大多数逻辑都可以用andor来表达,因此在条件中引入了额外的“混乱”。

【讨论】:

  • 非常感谢。有用。你能简单介绍一下这里的逻辑吗?
【解决方案2】:

您可以使用基于 EMP_DEPT = 'HR' 的行数的案例来执行此操作;如果计数不为零,则返回带有EMP_DEPT = 'HR' 的行,否则返回带有EMP_DEPT = 'DEV' 的行。

SELECT *
FROM EMP_TABLE
WHERE EMP_DEPT = CASE WHEN (SELECT COUNT(*) FROM EMP_TABLE WHERE EMP_DEPT = 'HR') > 0 THEN 'HR' ELSE 'DEV' END

Demo on dbfiddle

【讨论】:

  • 谢谢它的工作。有没有其他方法可以避免另一个选择语句。我的数据非常庞大。
  • @Impromptu_Coder 在EMP_DEPT 上有一个索引,第二个选择(对于 Gordon 或我的查询)应该非常快,并且应该只执行一次,因为它们都有一个恒定的结果。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多