Oracle SQL 如何在第一个条件没有被接受的情况下才执行第二个条件?
Oracle SQL How to execute the second condition only if the first one has not been accepted?
希望有人能帮助我。案例:
我有一个 table 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)
我不需要检查其他的, return 只需要检查这个寄存器。如果我没有。我将在没有 TEAM_ID 的情况下进行检查(没有 TEAM_ID 的访问对 AREA_ID 内的所有团队都有效)。但是如果我执行这个查询,我会在第一个条件、第二个条件和第三个条件下收到寄存器。这不是我的意图。如果我在第一种情况下找到一个(更具体),我不需要其他 return 只有这个注册。如果我之前没有找到任何条件,我只会检查第二个和第三个条件。
有人可以帮帮我吗?
从 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;
希望有人能帮助我。案例:
我有一个 table 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)
我不需要检查其他的, return 只需要检查这个寄存器。如果我没有。我将在没有 TEAM_ID 的情况下进行检查(没有 TEAM_ID 的访问对 AREA_ID 内的所有团队都有效)。但是如果我执行这个查询,我会在第一个条件、第二个条件和第三个条件下收到寄存器。这不是我的意图。如果我在第一种情况下找到一个(更具体),我不需要其他 return 只有这个注册。如果我之前没有找到任何条件,我只会检查第二个和第三个条件。
有人可以帮帮我吗?
从 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;