簡體   English   中英

在同一查詢中使用case語句的Oracle子查詢

[英]Oracle subquery using case statement in same query

我在Oracle中有一個案例陳述; 然后,我需要一個子查詢才能在同一查詢中使用case語句的結果。 我怎樣才能做到這一點?

這是查詢和子查詢的部分:

CL.TC_DEFECT_1,
CASE
    WHEN CL.TC_DEFECT_1_SELECTION = 10000000 THEN 1
    WHEN CL.TC_DEFECT_1_SELECTION = 01000000 THEN 2
    WHEN CL.TC_DEFECT_1_SELECTION = 00100000 THEN 3
    WHEN CL.TC_DEFECT_1_SELECTION = 00010000 THEN 4
    WHEN CL.TC_DEFECT_1_SELECTION = 00001000 THEN 5
    WHEN CL.TC_DEFECT_1_SELECTION = 00000100 THEN 6
    WHEN CL.TC_DEFECT_1_SELECTION = 00000010 THEN 7
    WHEN CL.TC_DEFECT_1_SELECTION = 00000001 THEN 8
END AS "DEFECT_1_SORT_ORDER",

(SELECT TC_DESCRIPTION_FR FROM TBYE60_DEFECT_CODES DC 
WHERE DC.TC_CODE_DEF = CL.TC_DEFECT_1 
AND DC.TC_SORT_ORDER = DEFECT_1_SORT_ORDER 
AND rownum=1) AS SUB_DEFECT_1_DESC,

我不知道oracle,但您可以閱讀有關LATERAL JOIN的信息。 您可以執行以下操作:

            CL.TC_DEFECT_1,
                "DEFECT_1_SORT_ORDER",

                    (SELECT TC_DESCRIPTION_FR FROM TBYE60_DEFECT_CODES DC WHERE DC.TC_CODE_DEF = CL.TC_DEFECT_1 AND DC.TC_SORT_ORDER = CL.DEFECT_1_SORT_ORDER AND rownum=1) AS SUB_DEFECT_1_DESC
    ...
    FROM
    ...
    CROSS JOIN TABLE(
    SELECT             CASE
                    WHEN CL.TC_DEFECT_1_SELECTION = 10000000 THEN 1
                    WHEN CL.TC_DEFECT_1_SELECTION = 01000000 THEN 2
                    WHEN CL.TC_DEFECT_1_SELECTION = 00100000 THEN 3
                    WHEN CL.TC_DEFECT_1_SELECTION = 00010000 THEN 4
                    WHEN CL.TC_DEFECT_1_SELECTION = 00001000 THEN 5
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000100 THEN 6
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000010 THEN 7
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000001 THEN 8
                END AS "DEFECT_1_SORT_ORDER"
from dual

    ) a

要么

           CL.TC_DEFECT_1,
                "DEFECT_1_SORT_ORDER",

                    (SELECT TC_DESCRIPTION_FR FROM TBYE60_DEFECT_CODES DC WHERE DC.TC_CODE_DEF = CL.TC_DEFECT_1 AND DC.TC_SORT_ORDER = CL.DEFECT_1_SORT_ORDER AND rownum=1) AS SUB_DEFECT_1_DESC
    ...
    FROM
    ...
    LATERAL (
    SELECT             CASE
                    WHEN CL.TC_DEFECT_1_SELECTION = 10000000 THEN 1
                    WHEN CL.TC_DEFECT_1_SELECTION = 01000000 THEN 2
                    WHEN CL.TC_DEFECT_1_SELECTION = 00100000 THEN 3
                    WHEN CL.TC_DEFECT_1_SELECTION = 00010000 THEN 4
                    WHEN CL.TC_DEFECT_1_SELECTION = 00001000 THEN 5
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000100 THEN 6
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000010 THEN 7
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000001 THEN 8
                END AS "DEFECT_1_SORT_ORDER"
from dual

    ) a

我不完全了解您的初衷,因為我看到您可以輕松地使用INSTR函數來代替case語句:

CASE
    WHEN CL.TC_DEFECT_1_SELECTION = 10000000 THEN 1
    WHEN CL.TC_DEFECT_1_SELECTION = 01000000 THEN 2
    WHEN CL.TC_DEFECT_1_SELECTION = 00100000 THEN 3
    WHEN CL.TC_DEFECT_1_SELECTION = 00010000 THEN 4
    WHEN CL.TC_DEFECT_1_SELECTION = 00001000 THEN 5
    WHEN CL.TC_DEFECT_1_SELECTION = 00000100 THEN 6
    WHEN CL.TC_DEFECT_1_SELECTION = 00000010 THEN 7
    WHEN CL.TC_DEFECT_1_SELECTION = 00000001 THEN 8
END AS "DEFECT_1_SORT_ORDER"

可以模擬為:

INSTR(CL.TC_DEFECT_1_SELECTION,'1') as AS "DEFECT_1_SORT_ORDER" 
--you need also to check if CL.TC_DEFECT_1_SELECTION in (above collection) 

希望這會有用。

只需使用子查詢即可。 在子查詢中定義DEFECT_1_SORT_ORDER ,然后在外部查詢中使用它:

select . . ., DEFECT_1_SORT_ORDER,
       (SELECT TC_DESCRIPTION_FR
        FROM TBYE60_DEFECT_CODES DC
        WHERE DC.TC_CODE_DEF = CL.TC_DEFECT_1 AND
              DC.TC_SORT_ORDER = CL.DEFECT_1_SORT_ORDER AND rownum=1
       ) AS SUB_DEFECT_1_DESC
from (select . . .,
             (CASE
                    WHEN CL.TC_DEFECT_1_SELECTION = 10000000 THEN 1
                    WHEN CL.TC_DEFECT_1_SELECTION = 01000000 THEN 2
                    WHEN CL.TC_DEFECT_1_SELECTION = 00100000 THEN 3
                    WHEN CL.TC_DEFECT_1_SELECTION = 00010000 THEN 4
                    WHEN CL.TC_DEFECT_1_SELECTION = 00001000 THEN 5
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000100 THEN 6
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000010 THEN 7
                    WHEN CL.TC_DEFECT_1_SELECTION = 00000001 THEN 8
                END) AS "DEFECT_1_SORT_ORDER"
      from . . .

您可以在擁有SUB_DEFECT_1_DESC的地方使用clausole WITH,然后在要使用SUB_DEFECT_1_DESC的結果的地方使用CASE。

暫無
暫無

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

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