带有 CASE 字段的 Oracle 查询.当取决于子查询的先前字段时



我不知道确切(为了避免重写条件(如何在另一个字段中重用基于SELECT的字段(基于CASE WHEN(。

这是我的查询:

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;

所以在这里我想创建一个字段IS_DIRECTORATE,并从之前从 SELECT 子查询创建的字段 LEVEL 中IS_UNIT

你能帮我做到这一点吗?

提前感谢您的帮助。

塞布

您不需要子查询,只需连接它们并创建具有所需值的两列:

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;

我会重写您的查询以在两个表之间使用显式连接,这解决了您遇到的许多问题:

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;

请注意,为了保留查询的原始行为,我们在此处使用联接,而不是内部联接。 您必须确定级别的子查询不会导致UNITS中的记录被过滤掉。

最新更新