【发布时间】:2016-06-17 08:36:58
【问题描述】:
我有一串用逗号分隔的数字,例如“7845,6986,2548” 我想拆分逗号并将结果传递给 select 语句的 IN 子句 我曾经使用过这个功能:
create or replace TYPE t_in_list_tab as table of varchar2(4000);
create or replace FUNCTION in_list (p_in_list IN VARCHAR2)
RETURN t_in_list_tab
AS
l_tab t_in_list_tab := t_in_list_tab();
l_text VARCHAR2(32767) := p_in_list || ',';
l_idx NUMBER;
BEGIN
LOOP
l_idx := INSTR(l_text, ',');
EXIT WHEN NVL(l_idx, 0) = 0;
l_tab.extend;
l_tab(l_tab.last) := TRIM(SUBSTR(l_text, 1, l_idx - 1));
l_text := SUBSTR(l_text, l_idx + 1);
END LOOP;
RETURN l_tab;
END;
这个函数的返回类型是 varchar2 但我的列类型是数字,我尝试使用 TO_NUMBER 像:
select * from my_tbl where col1 IN (TO_NUMBER(select * from table(IN_LIST('7845,6986,2548'))));
但它没有工作, 有什么帮助吗?
【问题讨论】:
-
与重复问题相同 - 您无需使用
IN ( ( SELECT ... FROM TABLE( ... ) ) ),只需使用MEMBER OF IN_LIST( '1,2,3' )即可。 -
您也可以拥有
CREATE TYPE intlist IS TABLE OF INTEGER;并在函数内使用该集合和TO_NUMBER()。