2016-06-17 29 views
0

「7845,6986,2548」のようにコンマで区切られた文字列があります 私はコンマを分割してselect文のIN句に結果を渡したい この機能を使用します。 任意のヘルプ、PL SQLコンマで区切られた文字列から数値の配列を作成

select * from my_tbl where col1 IN (TO_NUMBER(select * from table(IN_LIST('7845,6986,2548')))); 

が、それはうまくいきませんでした:

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を使用しようとしました?

+0

重複した質問と同じです。あなたは 'IN((SELECT ... FROM TABLE(...))) '' MEMBER OF IN_LIST( '1,2,3') 'だけを使用できます。 – MT0

+0

また、 'CREATE TYPE intlist IS TABLE OF INTEGER;'を作成し、関数内でそのコレクションと 'TO_NUMBER()'を使用することもできます。 – MT0

答えて

0

あなたはto_number()コールの内側(column_valueと呼ばれている)table collection expressionから列を配置する必要があります。

select to_number(column_value) from table(IN_LIST('7845,6986,2548') 

はデモ:

with my_tbl(col1, col2) as (
    select 7845, 'Test 1' from dual 
    union all select 2548, 'Test 2' from dual 
    union all select 9999, 'Test 3' from dual 
) 
select * from my_tbl where col1 IN (
    select to_number(column_value) from table(IN_LIST('7845,6986,2548')) 
); 

     COL1 COL2 
---------- ------ 
     7845 Test 1 
     2548 Test 2 

ます。また、参加を使用することができます

select my_tbl.* 
from 
(
    select * from table(IN_LIST('7845,6986,2548')) 
) tmp 
join my_tbl 
on my_tbl.col1 = to_number(tmp.column_value); 
+1

'MEMBER OF'コレクション演算子を使うこともできます。 'SELECT * FROM my_tbl WHERE col1 MEMBER OF IN_LIST( '7845,6986,2548')' – MT0

+0

@MTO - 関数が数値のテーブルを返す場合にのみ機能します( 'to_char(col1)'は間違っています) ;それは暗黙の変換を行うようには見えません。数値コレクションを使用することは、利用可能な場合、または作成可能な場合はもちろんです。 –

関連する問題