2014-12-02 65 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