2013-10-04 11 views
0

我相信ELSE中的SELECT語句也是可以的,對吧?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。

我在哪裏做錯了?

+1

你確定它只返回1個結果嗎?嘗試運行它sepparately並查看結果。 –

+0

將該查詢作爲獨立查詢運行,並檢查它是否總是隻返回一行。 –

+0

用'SELECT COUNT(*)'更改'SELECT P.VENDOR_ID'並查找包含兩個(或更多)行的結果。 –

回答

0

的情況下表達你重新寫是給那個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),以便它與該空字符串兼容。

最後,你當然可以使用equal運算符比較日期;但數據可能不相同,例如可能會有幾秒鐘或幾分鐘的差異。可能需要截斷日期以消除該問題,例如

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

,但只能這樣做是真正需要的,否則你就是在浪費精力與TRUNC()函數。

1

使用

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

TOP還在Oracle?我認爲是特定於MS-SQL的 – rkosegi