加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

plsql – PL / SQL – IN CLAUSE中以逗号分隔的列表

发布时间:2020-12-12 16:25:16 所属栏目:MsSql教程 来源:网络整理
导读:我无法获得一块pl / sql代码.在我的程序的顶部,我从我的oracle apex应用程序中获取了一些复选框的数据.因为包含复选框的报表是动态生成的,所以我必须遍历 APEX_APPLICATION.G_F01 列出并生成一个逗号分隔的字符串,如下所示 v_list VARCHAR2(255) := (1,3,5,9,
我无法获得一块pl / sql代码.在我的程序的顶部,我从我的oracle apex应用程序中获取了一些复选框的数据.因为包含复选框的报表是动态生成的,所以我必须遍历
APEX_APPLICATION.G_F01

列出并生成一个逗号分隔的字符串,如下所示

v_list VARCHAR2(255) := (1,3,5,9,10);

我想稍后在该列表上查询并将v_list放在IN子句上,如此

SELECT * FROM users 
WHERE user_id IN (v_list);

这当然会引发错误.我的问题是我可以将v_list转换为什么,以便能够将它插入到pl / sql过程中的查询中的IN子句中?

解决方法

如果用户很小且user_id不包含逗号,您可以使用:
SELECT * FROM users WHERE ',' || v_list || ',' LIKE '%,'||user_id||',%'

此查询不是最佳的,因为它无法在user_id上使用索引.

我建议你使用一个流水线函数,它返回一个你可以直接查询的NUMBER表.例如:

CREATE TYPE tab_number IS TABLE OF NUMBER;
/
CREATE OR REPLACE FUNCTION string_to_table_num(p VARCHAR2)
   RETURN tab_number
   PIPELINED IS
BEGIN
   FOR cc IN (SELECT rtrim(regexp_substr(str,'[^,]*,',1,level),') res
                FROM (SELECT p || ',' str FROM dual)
              CONNECT BY level <= length(str) 
                                  - length(replace(str,''))) LOOP
      PIPE ROW(cc.res);
   END LOOP;
END;
/

然后,您就可以构建如下查询:

SELECT * 
  FROM users 
 WHERE user_id IN (SELECT *
                     FROM TABLE(string_to_table_num('1,2,4,5'));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读