我已经查看过已经就这个问题提出的一些问题,但没有人回答我的问题。
我有一个表,其中列可以包含数字和空值
根据我发送到我的存储过程的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
答案 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),但它们有助于提高可读性。
祝你好运!