簡體   English   中英

Oracle SQL 如果第一個條件沒有被接受,如何執行第二個條件?

[英]Oracle SQL How to execute the second condition only if the first one has not been accepted?

我希望有一個人可以幫助我。 案子:

我有一個包含這些列的COMPANY_ACCESS表:

ID NUMBER,
COMPANY_ID NUMBER,
AREA_ID NUMBER,
TEAM_ID NUMBER,
CAN_ACCESS BOOLEAN

我有我的查詢(不起作用):

SELECT * 
FROM COMPANY_ACCESS ca
WHERE 
    ca.CAN_ACCESS = true
    AND ((ca.COMPANY_ID = ?1 AND ca.AREA_ID = ?2 AND ca.TEAM_ID = ?3)
         OR (ca.COMPANY_ID = ?1 AND ca.AREA_ID = ?2 AND ca.TEAM_ID IS NULL)
         OR (ca.COMPANY_ID = ?1 AND ca.AREA_ID IS NULL AND ca.TEAM_ID IS NULL))

我在這里的意圖是什么。 從更具體的訪問(使用所有參數)到不太具體的訪問。 如果我在第一個條件下有一個寄存器:

(COMPANY_ID = ?1 AND AREA_ID = ?2 AND TEAM_ID = ?3)

我不需要檢查其他人,只返回這個寄存器。 如果我沒有。 我將在沒有 TEAM_ID 的情況下進行檢查(沒有 TEAM_ID 的訪問對 AREA_ID 內的所有團隊都有效)。 但是,如果我執行此查詢,我會在第一個條件、第二個條件和第三個條件中收到寄存器。 這不是我的本意。 如果我在第一個條件(更具體)中找到一個,我不需要其他人只返回這個寄存器。 如果我之前沒有找到任何條件,我只會檢查第二個和第三個條件。

請問有人可以幫我嗎?

從 Oracle 12 開始,您可以使用綁定變量過濾行,然后對結果集進行排序,以便首先使用您的首選行,然后使用FETCH FIRST ROW WITH TIES過濾掉其他行:

SELECT * 
FROM   COMPANY_ACCESS ca
WHERE  ca.CAN_ACCESS = true
AND    ca.COMPANY_ID = ?
AND    (   (ca.AREA_ID = ? AND (ca.TEAM_ID = ? OR ca.TEAM_ID IS NULL))
        OR (ca.AREA_ID IS NULL AND ca.TEAM_ID IS NULL))
ORDER BY
       ca.AREA_ID NULLS LAST,
       ca.TEAM_ID NULLS LAST
FETCH FIRST ROW WITH TIES;

在早期版本中,您可以使用分析函數進行過濾:

SELECT *
FROM   (
  SELECT ca.*,
         RANK() OVER (
           ORDER BY ca.AREA_ID NULLS LAST, ca.TEAM_ID NULLS LAST
         ) AS rnk
  FROM   COMPANY_ACCESS ca
  WHERE  ca.CAN_ACCESS = true
  AND    ca.COMPANY_ID = ?
  AND    (   (ca.AREA_ID = ? AND (ca.TEAM_ID = ? OR ca.TEAM_ID IS NULL))
          OR (ca.AREA_ID IS NULL AND ca.TEAM_ID IS NULL))
)
WHERE  rnk = 1;

如果只有一個匹配行,那么您可以使用ROWNUM進行過濾:

SELECT *
FROM   (
  SELECT *
  FROM   COMPANY_ACCESS ca
  WHERE  ca.CAN_ACCESS = true
  AND    ca.COMPANY_ID = ?
  AND    (   (ca.AREA_ID = ? AND (ca.TEAM_ID = ? OR ca.TEAM_ID IS NULL))
          OR (ca.AREA_ID IS NULL AND ca.TEAM_ID IS NULL))
  ORDER BY
         ca.AREA_ID NULLS LAST,
         ca.TEAM_ID NULLS LAST
)
WHERE  ROWNUM = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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