我一直在尝试转换逗号分隔的字符串" 5430,5456,5450",字符串的长度是变化的,以逗号分隔的整数并在存储过程中将其用作查询的参数其route_id列为数字类型的数据库。
我见过一些例子,但似乎没有任何效果。这些是参数和查询:
P_business_date IN VARCHAR2,
P_route_ids IN VARCHAR2
SELECT rt.route_id , rt.route_name, i.data_file_name, i.bus_date, stdesc.status_code, i.batch_in_id In_Id , i.modified_date In_Time
FROM gthdba.gth_in_batch i , gthdba.gth_route rt , gthdba.gth_route_source_status st , gthdba.gth_status stdesc
WHERE rt.route_id = i.route_id
AND rt.route_id = st.route_id
AND st.run_seq_no = i.run_seq_no
AND stdesc.status_id = st.status_Id
AND i.bus_date = to_date (''' || P_business_date || ''','' YYYYMMDD'')
AND RT.ROUTE_ID IN (''' || P_route_ids || ''')
AND i.modified_date > to_date (''' || P_business_date || '',''YYYYMMDD '')
ORDER BY IN_ID DESC, ROUTE_ID';
由于
答案 0 :(得分:2)
如果string1 == string2,string1 in (string2)
返回true,则初始解决方案无效。 (顺便说一句,它可以被修改为“动态SQL”,如果你愿意,可以尝试)。
快速但不是最快的解决方案是:
SELECT ...
FROM ...
AND i.bus_date = to_date (P_business_date,'YYYYMMDD')
AND INSTR(''' || P_route_ids || ''', ''' || RT.ROUTE_ID || ''') != 0
AND i.modified_date > to_date (P_business_date,'YYYYMMDD')
ORDER BY IN_ID DESC, ROUTE_ID';
INSTR函数返回输入字符串中的子字符串位置。
例如,路线的标识为10
,参数为10,20,30
:
instr(',10,20,30,', ',10,') != 0
将选择路线。
答案 1 :(得分:0)
另一种方法是更改过程以解析p_route_ids
字符串,并将唯一的整数值插入临时表中。这意味着您可以更改查询以加入临时表,而不是使用AND rt.route_id IN (...)
。
答案 2 :(得分:0)
嘿嘿谢谢你的帖子,
我已经找到了我的问题的另一个解决方案,它涉及使用xmltables,一个函数。它在我的情况||中输入字符串p_route_id ||作为列临时表,你可以选择column_values的coulmn并将其转换为整数类型并使用它,所以我的查询现在看起来像这样
AND RT.ROUTE_ID IN(SELECT TO_NUMBER(column_value)FROM XMLTABLE('''|| P_route_ids ||'''))
希望这有帮助。