WHERE 中的多个值基于条件

Multiple values in WHERE based on condition

我有一个输入参数,基于它我还必须包含 NULL 和 EMPTY VALUES。

If(TYPE=='HIGH') THEN TYPE='HIGH' OR TYPE ='' OR TYPE IS NULL
IF(TYPE=='LOW') THEN TYPE='LOW'

查询我试过了,但没有用。

SELECT * FROM PAYRECORDS
WHERE (TYPE =(CASE WHEN TYPE=:IP_TYPE THEN TYPE END) 
OR TYPE IS NULL OR TYPE='')  

只需使用布尔逻辑:

WHERE (:IP_TYPE = 'HIGH' AND (TYPE = 'HIGH' OR TYPE = '' OR TYPE IS NULL)
      ) OR
      (:IP_TYPE = 'LOW' AND TYPE = 'LOW')

或更简洁:

WHERE :IP_TYPE = TYPE OR
      (:IP_TYPE = 'HIGH' AND (TYPE = '' OR TYPE IS NULL))

在Oracle中,一个空字符串''等同于NULL;所以你的过滤器可以简单地是:

SELECT * 
FROM   PAYRECORDS
WHERE  :ip_type = type
OR     (:ip_type = 'HIGH' AND type IS NULL);

您还可以使用 NVL() 来考虑当列 type 未填充时应将其视为 HIGH:

SELECT * 
FROM   PAYRECORDS
WHERE  NVL(type, 'HIGH') = :ip_type;