我正在使用Oracle-10g,即时创建一个需要在输入参数中取前4个值的查询。
用户在模块中运行报表时会提供许多输入,但如果用户提供的值超过4,则查询需要前4个值。 如果用户给出小于4或等于4,则取所有值。 每个输入值将由用户以逗号(,)分隔。 用户的输入值是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
)
这给了我一个错误&#34; ORA-00905:缺少关键字&#34;
任何人都可以帮我解决这个问题吗?
提前致谢, 普里亚
答案 0 :(得分: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 || ',%'