[英]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.