sql - 带有CASE语句的条件WHERE子句的问题

时间:2016-04-15 18:54:51

标签: sql oracle case where-clause

我已经查看过已经就这个问题提出的一些问题,但没有人回答我的问题。

我有一个表,其中列可以包含数字和空值

根据我发送到我的存储过程的ID,我要么必须选择id为null的位置,要么匹配id或所有id。

这是我所拥有的,但它不起作用。

pi_region_id = 51表示我需要所有hrcc_id = null

pi_region_id不是51或52然后hrcc_id = pi_region_id

else(意思是52),全部归还

SELECT i.indicator_id AS ID, 
        i.indicator_name_en AS name_en,
        h.region_code
      FROM indicators i
      JOIN hrcc h ON h.hrcc_id = i.hrcc_id
      WHERE (CASE WHEN pi_region_id = 51 THEN i.hrcc_id IS NULL
                  WHEN pi_region_id != 51 OR pi_region_id != 52 THEN i.hrcc_id := pi_region_id
                  ELSE NULL END)
      ORDER BY i.hrcc_id ASC

Oracle给我一个“ORA-00905:missing keyword”,错误似乎在i.hrcc_id IS NULL上。

我仍然是pl / sql的新手,所以任何帮助都会非常感激。

谢谢!

更新

我的表格示例

指标

INDICATOR_ID | INDICATOR_NAME_EN | HRCC_ID

1 |东西| (空)

2 |另一个| 1

3 |再次| 2

HRCC

HRCC_ID | REGION_CODE

1 | QC

2 | ON

(对不起......无法让它看起来更好)

我需要的是:

pi_region_id = 51只返回HRCC_ID为空的INDICATORS中的行

pi_region_id = 52返回eveything

pi_region_id = 1例如,返回INICATORS的行,其中HRCC_ID = 1

1 个答案:

答案 0 :(得分:1)

一些注意事项:不确定为什么需要PL / SQL,这似乎是您应该能够在标准SQL中执行的操作。在CASE语句中,您使用:=在一个地方,即PL / SQL赋值运算符 - 您可能希望测试它是否相等。最后,您不应该需要CASE构造 - 您的WHERE子句可以这样说:

...
where (pi_region_id = 52) or (pi_region_id = 51 and i.hrcc_id is null)
   or (pi_region_id != 51 and i.hrcc_id = pi_region_id)

说明:如果pi_region_id = 52,则第一个条件为true,因此返回所有行。否则,如果pi_region_id = 51或!= 51,则根据您的规则返回行。括号不是必需的(AND优于OR),但它们有助于提高可读性。

祝你好运!