簡體   English   中英

SELECT語句在ELSE部分嗎?

[英]SELECT statement in ELSE part?

我相信ELSE中的SELECT語句也是可能的,對嗎?

我有這個查詢:

CASE ORDER1
        WHEN NULL
            THEN ''
        ELSE (
                SELECT P.VENDOR_ID
                FROM ORDERS1${RGCM_CAMP_LOGIC_SUFFIX} P
                LEFT JOIN ORDERS2${RGCM_CAMP_LOGIC_SUFFIX} O
                    ON P.CUSTOMER_ID = O.CUSTOMER_ID
                WHERE P.ORDER_DATE = O.ORDER1
                )
        END AS VENDOR_ID1

我很確定,子查詢僅返回1行,但仍出現錯誤:ORA-01427:單行子查詢返回多於一行

我正在檢查是否有任何ORDER1,則應選擇其VENDOR_ID,並將其稱為VENDOR_ID1。

我在哪里做錯了?

采用

 - SELECT MAX(P.VENDOR_ID)  or
 - SELECT TOP 1 P.VENDOR_ID

您對case表達式的重寫導致該ORA錯誤,因為您忘記了IS NULL

CASE WHEN ORDER1 IS NULL

但是:我不建議在select子句中使用相關子查詢-似乎是一種非常低效的方法-即使它位於case表達式中。

您的整體查詢還不夠,無法確切知道要提出的建議,但是您應該將該邏輯移入聯接中,類似這樣

LEFT JOIN (
SELECT CUSTOMER_ID
    , ORDER_DATE
    , VENDOR_ID
FROM ORDERS16F50TQDWsb
) P ON O.CUSTOMER_ID = P.CUSTOMER_ID
AND O.ORDER1 = P.ORDER_DATE

請注意,您可能必須在此處使用GROUP BY,以便不會獲得比預期多的行,但是如果您確實需要這樣做,則可能還需要適當地使用MAX(ORDER_DATE)[或MIN()] 。 只有利用您的整體查詢的更多細節,我才能做到這一點。

一旦弄清了如何收集這些信息,那么案例表達式就會變得簡單得多:

CASE WHEN ORDER1 IS NULL THEN '' ELSE P.VENDOR_ID END AS VENDOR_ID1,

並且,您需要確保VENDOR_ID1的日期類型是字符串,然后不是,則必須使用to_char(VENDOR_ID1),以便它與該空字符串兼容。

最后,您當然可以使用等號運算符比較日期; 但是數據可能不相等,例如可能有幾秒鍾或幾分鍾的差異。 可能有必要截斷日期以消除該問題,例如

TRUNC(O.ORDER1)= TRUNC(P.ORDER_DATE)

但實際上只需要這樣做,否則您將浪費那些TRUNC()函數。

暫無
暫無

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

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