如何将逗号分隔的字符串转换为逗号分隔的整数并将其作为参数传递给Oracle?

时间:2014-08-19 10:34:13

标签: oracle comma separation-of-concerns

我一直在尝试转换逗号分隔的字符串" 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';

由于

3 个答案:

答案 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 ||'''))

希望这有帮助。