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

标签 sql oracle plsql

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

谢谢

最佳答案

最初的解决方案无法工作,因为如果 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函数返回输入字符串中的子字符串位置。

例如,一条路由的 ID 为 10,参数为 10,20,30:

instr(',10,20,30,', ',10,') != 0

并且将选择路线。

关于sql - 如何将逗号分隔的字符串转换为逗号分隔的整数并将其作为 Oracle 中的参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25381209/

相关文章:

sql - INSTEAD OF 触发器和 CASCADE 路径

sql - 如何在 Postgre 中返回主列名?

mysql - 优先考虑找到匹配项的那些字段

java - Oracle 10g 声称包体有错误但实际上没有

SQL 选择表 1 或表 2

java - 结果集 : do {. ..} while (...);与 while(...) {...}

sql - 如何获取列上最后更新的行

plsql - PLS-00103 函数结束时出错

oracle - 在Oracle SQL Developer代码窗口中使用变量运行sql代码

plsql - 如何从正确的 PLSQL 读取字符串