带有 CASE...WHEN 字段的 Oracle 查询取决于子查询的前一个字段
Oracle query with field with CASE...WHEN depending of a prevous field of a sub-query
我不完全知道(为了避免重写条件)如何在另一个字段(基于 CASE WHEN)中重新使用基于 SELECT 的字段。
这里是我的查询:
SELECT U.ID AS ID,
U.TITLE,
U.VALID_FROM,
U.VALID_TO,
(
SELECT LEVEL
FROM UNITS_LEVELS L
WHERE L.ID = U.ID
) AS LEVEL,
CASE LEVEL
WHEN 3 THEN 1
ELSE 0
END AS IS_DIRECTORATE,
CASE LEVEL
WHEN 4 THEN 1
ELSE 0
END AS IS_UNIT,
FROM UNITS U;
所以在这里我想从字段 LEVEL 创建字段 IS_DIRECTORATE 和 IS_UNIT先前从 SELECT 子查询创建。
你能帮我做一下吗?
在此先感谢您的帮助。
塞布
我会重写您的查询以在两个表之间使用显式连接,这可以解决您遇到的许多问题:
SELECT
U.ID AS ID,
U.TITLE,
U.VALID_FROM,
U.VALID_TO,
L.LEVEL,
CASE L.LEVEL WHEN 3 THEN 1 ELSE 0 END AS IS_DIRECTORATE,
CASE L.LEVEL WHEN 4 THEN 1 ELSE 0 END AS IS_UNIT
FROM UNITS U
LEFT JOIN UNITS_LEVELS L
ON L.ID = U.ID;
请注意,为了保留查询的原始行为,我们在此处使用 left 联接,而不是内部联接。您必须确定级别的子查询不会导致 UNITS
中的记录被过滤掉。
您不需要子查询,只需连接它们并创建具有所需值的两列:
SELECT U.ID AS ID,
U.TITLE,
U.VALID_FROM,
U.VALID_TO,
L.LEVEL, /*if you need this one keep it here */
CASE L.LEVEL /*and here the columns as you've defined them */
WHEN 3 THEN 1
ELSE 0
END AS IS_DIRECTORATE,
CASE L.LEVEL
WHEN 4 THEN 1
ELSE 0
END AS IS_UNIT,
FROM UNITS U, UNITS_LEVELS L
WHERE L.ID = U.ID;
我不完全知道(为了避免重写条件)如何在另一个字段(基于 CASE WHEN)中重新使用基于 SELECT 的字段。
这里是我的查询:
SELECT U.ID AS ID,
U.TITLE,
U.VALID_FROM,
U.VALID_TO,
(
SELECT LEVEL
FROM UNITS_LEVELS L
WHERE L.ID = U.ID
) AS LEVEL,
CASE LEVEL
WHEN 3 THEN 1
ELSE 0
END AS IS_DIRECTORATE,
CASE LEVEL
WHEN 4 THEN 1
ELSE 0
END AS IS_UNIT,
FROM UNITS U;
所以在这里我想从字段 LEVEL 创建字段 IS_DIRECTORATE 和 IS_UNIT先前从 SELECT 子查询创建。
你能帮我做一下吗?
在此先感谢您的帮助。
塞布
我会重写您的查询以在两个表之间使用显式连接,这可以解决您遇到的许多问题:
SELECT
U.ID AS ID,
U.TITLE,
U.VALID_FROM,
U.VALID_TO,
L.LEVEL,
CASE L.LEVEL WHEN 3 THEN 1 ELSE 0 END AS IS_DIRECTORATE,
CASE L.LEVEL WHEN 4 THEN 1 ELSE 0 END AS IS_UNIT
FROM UNITS U
LEFT JOIN UNITS_LEVELS L
ON L.ID = U.ID;
请注意,为了保留查询的原始行为,我们在此处使用 left 联接,而不是内部联接。您必须确定级别的子查询不会导致 UNITS
中的记录被过滤掉。
您不需要子查询,只需连接它们并创建具有所需值的两列:
SELECT U.ID AS ID,
U.TITLE,
U.VALID_FROM,
U.VALID_TO,
L.LEVEL, /*if you need this one keep it here */
CASE L.LEVEL /*and here the columns as you've defined them */
WHEN 3 THEN 1
ELSE 0
END AS IS_DIRECTORATE,
CASE L.LEVEL
WHEN 4 THEN 1
ELSE 0
END AS IS_UNIT,
FROM UNITS U, UNITS_LEVELS L
WHERE L.ID = U.ID;