sql - CASE 语句的条件 WHERE 子句问题
sql - problems with conditional WHERE clause with CASE statement
我已经查看了关于这个主题的一些问题,但 none 回答了我的问题。
我有一个 table 列可以容纳数字和空值
根据我发送到我的存储过程的 ID,我必须 select ID 为空或匹配 ID 或所有 ID。
这是我有的,但它不起作用。
pi_region_id = 51 意味着我需要所有 hrcc_id = null
pi_region_id 不是 51 或 52 那么 hrcc_id = pi_region_id
else(意思是 52),return 全部
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 方面仍然是新手,所以任何帮助将不胜感激。
谢谢!
更新
我的例子 tables
指标
INDICATOR_ID | INDICATOR_NAME_EN | HRCC_ID
1 |东西 | (空)
2 |另一个 | 1
3 |再一次 | 2
HRCC
HRCC_ID | REGION_CODE
1 |质量控制
2 |开启
(抱歉...无法让它看起来更好)
我需要的是:
pi_region_id = 51 到 return 只有指标中的行,其中 HRCC_ID 为 NULL
pi_region_id = 52 到 return 一切
pi_region_id = 1 例如,INICATORS 上的 return 行,其中 HRCC_ID = 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,第一个条件为真,所以所有行都是 returned。否则,如果 pi_region_id = 51 或 != 51,则根据您的规则 return 行。括号不是必需的(AND 优先于 OR),但它们有助于提高可读性。
祝你好运!
我已经查看了关于这个主题的一些问题,但 none 回答了我的问题。
我有一个 table 列可以容纳数字和空值
根据我发送到我的存储过程的 ID,我必须 select ID 为空或匹配 ID 或所有 ID。
这是我有的,但它不起作用。
pi_region_id = 51 意味着我需要所有 hrcc_id = null
pi_region_id 不是 51 或 52 那么 hrcc_id = pi_region_id
else(意思是 52),return 全部
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 方面仍然是新手,所以任何帮助将不胜感激。
谢谢!
更新
我的例子 tables
指标
INDICATOR_ID | INDICATOR_NAME_EN | HRCC_ID
1 |东西 | (空)
2 |另一个 | 1
3 |再一次 | 2
HRCC
HRCC_ID | REGION_CODE
1 |质量控制
2 |开启
(抱歉...无法让它看起来更好)
我需要的是:
pi_region_id = 51 到 return 只有指标中的行,其中 HRCC_ID 为 NULL
pi_region_id = 52 到 return 一切
pi_region_id = 1 例如,INICATORS 上的 return 行,其中 HRCC_ID = 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,第一个条件为真,所以所有行都是 returned。否则,如果 pi_region_id = 51 或 != 51,则根据您的规则 return 行。括号不是必需的(AND 优先于 OR),但它们有助于提高可读性。
祝你好运!