2014-12-02 68 views
-1

我正在使用Oracle-10g,即時創建一個需要在輸入參數中取前4個值的查詢。使用oracle 10g取輸入參數中的前4個數值使用oracle 10g

用戶會給很多投入,同時運行模塊報告,但查詢需要,如果用戶提供了超過4 如果用戶給出小於4或等於4 每個輸入取所有的值取前4個值值將由用戶以逗號(,)分隔。 用戶的輸入值是qry中的參數。

我QRY如下:

SELECT C.COUNTRY_NAME,OA.CITY,OA.COUNTRY_CODE,D.DEPARTURE_NO,O.STORER_ORDER_ID 
FROM 
ORDERS O, 
ORDER_ADDRESS OA, 
STORE_ADRESS SA, 
DEPARTURE D, 
SHIPMENT S, 
LUID L, 
PICKLIST_LINE_PACK_LUID PL, 
STORER ST,COUNTRY C 
WHERE O.INTERNAL_ORDER_ID=OA.INTERNAL_ORDER_ID 
AND O.SHIPMENT_ID=S.SHIPMENT_ID 
AND S.DEPARTURE_NO=D.DEPARTURE_NO 
AND PL.INTERNAL_ORDER_ID=O.INTERNAL_ORDER_ID 
AND PL.PACK_LUID_NO=L.LUID_NO 
AND O.STORER_ID=ST.STORER_ID 
AND ST.STORE_ID=SA.STORE_ID 
and C.COUNTRY_CODE=OA.COUNTRY_CODE 
and D.DEPARTURE_NO IN(
CASE WHEN length('9821,9254,225,9821') - nvl(length(replace('9821,9254,225,9821',',')),0) <=3 
THEN 
9821,9254,225,9821 
End 
) 

這給了我一個錯誤 「ORA-00905:缺少關鍵字」

誰能PLSS幫我這個???

由於提前, 普里亞

回答

0
and D.DEPARTURE_NO IN(
CASE WHEN length('9821,9254,225,9821') - nvl(length(replace('9821,9254,225,9821',',')),0) <=3 
THEN 
9821,9254,225,9821 
End 
) 

這種情況是不正確 - CASE應該返回一個表達式,而不是一個表達式的列表。

你可以嘗試這樣的事情:

and ',' || 
    CASE WHEN LENGTH('9821,9254,225,9821,5') - LENGTH(REPLACE('9821,9254,225,9821,5',',')) > 3 
     THEN substr('9821,9254,225,9821,5', 1, instr('9821,9254,225,9821,5', ',', 1, 4)-1) 
     ELSE '9821,9254,225,9821,5' 
    END || ',' like '%,' || D.DEPARTURE_NO || ',%' 
+0

感謝ü這麼多..即時得到一個答案,但部分..這種情況下完美地工作,如果我只有4個輸入..如果投入超過4個以上,它的力量給了我一個答案。我的需求是,如果輸入超過4,它應該只取前4個值。我試過的qry:CASE WHEN長度('9908,9896,9891,9875,9869') - nvl(長度(替換('9908,9896,9891,9875,9869',',')),0)<= 3 THEN','|| '9908,9896,9891,9875,9869'|| ','END like'%,'|| D.DEPARTURE_NO || ',%' – Priya 2014-12-02 08:20:31

+0

以上嘗試過qry不給我一個答案..但我需要顯示第4個值的數據 – Priya 2014-12-02 08:24:02

+0

@Priya我已經更新了答案 – Multisync 2014-12-02 08:32:06