[英]sql - problems with conditional WHERE clause with CASE statement
我已經瀏覽了有關該主題的一些問題,但沒有一個回答我。
我有一個表,其中一列可以容納數字和空值
根據要發送到存儲過程的ID,我要么必須選擇ID為空的位置,要么要匹配ID或所有ID。
這是我所擁有的,但不起作用。
pi_region_id = 51表示我需要所有hrcc_id = null
pi_region_id不是51或52,則hrcc_id = pi_region_id
否則(代表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:缺少關鍵字”,錯誤似乎在i.hrcc_id IS NULL上。
我仍然是pl / sql的新手,因此非常感謝您的幫助。
謝謝!
更新
我的桌子的例子
指標
INDICATOR_ID | INDICATOR_NAME_EN | HRCC_ID
1 | 東西| (空值)
2 | 另一個| 1個
3 | 再次 2
人力資源委員會
HRCC_ID | REGION_CODE
1 | 質量控制
2 | 上
(對不起...無法讓它看起來更好)
我需要的是何時:
pi_region_id = 51,僅返回HRCC_ID為NULL的INDICATORS中的行
pi_region_id = 52以返回傳送
pi_region_id = 1,例如,返回INICATORS上的行,其中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,則第一個條件為true,因此將返回所有行。 否則,如果pi_region_id = 51或!= 51,則根據您的規則返回行。 括號不是必需的(AND或OR的優先級),但它們有助於提高可讀性。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.