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

时间:2019-09-02 13:54:25

标签: oracle subquery case-when

我不完全知道(为了避免重写条件)如何在另一个字段(基于CHEN 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;

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

你能帮我做到吗?

预先感谢您的帮助。

Seb

2 个答案:

答案 0 :(得分:0)

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

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中的记录被过滤掉。

答案 1 :(得分:0)

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

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;