簡體   English   中英

sql-使用CASE語句的條件WHERE子句的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM