Oracle 中的条件 where 子句

Conditional where clause in Oracle

我有如下数据库table

+----------+----------+------------+
| emp_code | emp_name | emp_status | 
+----------+----------+------------+
|   01     |   aaa    |     A      |
|   02     |   bbb    |     A      |
|   03     |   ccc    |     A      |
|   04     |   ddd    |     I      |
|   05     |   eee    |     I      |
|   06     |   fff    |     R      |
+----------+----------+------------+

我想根据将动态传递的 emp_status 选择值

 1. If emp_status='A' it should fetch emp_codes with emp_status='A'
 2. If emp_status='I' it should fetch all emp_codes except emp_status='I'
 3. If emp_status is null then fetch all emp_codes.

如何编写包含所有条件的单个 sql 查询?

您可以使用 ORAND 运算符来使用条件 WHERE 子句,如下所示:

SELECT EMP_CODE FROM YOUR_TABLE
WHERE ('&INPUT_STATUS' = 'A' AND emp_status='A')
   OR ('&INPUT_STATUS' = 'I' AND emp_status<>'I')
   OR ('&INPUT_STATUS' IS NULL)

干杯!!

您可以使用这样的 case..when 表达式:

SELECT *
  FROM tab
 WHERE CASE 
       WHEN :emp_status='A' THEN 'A'
       WHEN :emp_status='I' THEN emp_status 
       WHEN :emp_status is null THEN emp_status 
        END = emp_status
   AND ( emp_status != 'I' OR :emp_status is null ) 

其中 :emp_status 是要传递到查询中的绑定变量。

或者,您也可以使用 DECODE() 函数

SELECT *
  FROM tab
 WHERE DECODE( :emp_status, 'A', 'A', 'I', emp_status, null , emp_status ) = emp_status
   AND ( emp_status != 'I' OR :emp_status is null )