SQL在逗号分隔字符串中查找数字

时间:2016-10-07 12:03:40

标签: oracle oracle11g

我试图在逗号分隔字符串中找到一个数字(ID)。 我尝试使用Select,但没有工作。 我可以使用另一种方法吗?

SELECT CASE WHEN TO_CHAR(1) IN ('1, 2, 3, 4') THEN 1 ELSE 0 END AS Result
FROM DUAL

我总是得到' 0' 。有谁可以请帮助。

4 个答案:

答案 0 :(得分:4)

此类查询可以将逗号分隔列表转换为表格:

select regexp_substr('1,2,3,4','[^,]+', 1, level) val from dual
  connect by regexp_substr('1,2,3,4', '[^,]+', 1, level) is not null;

然后您可以执行查询结果。

另一个不错的选择是:

select to_number(column_value) as IDs from xmltable('1,2,3,4,5');

答案 1 :(得分:3)

以逗号分隔的字符串'在SQL或PL / SQL中不是一个东西,因此IN()构造不会将它解析为单个值。你需要的是一个文本模式匹配表达式,例如

之类的东西
select case
           when regexp_like('1, 2, 3, 4', '(^| )1($|,)') then 'Yes' else 'No'
       end as matched
from   dual;

答案 2 :(得分:2)

您的查询未返回1,因为您的查询正在对此进行测试 是' 1' =' 1,2,3,4' (并返回false)

此查询返回1

SELECT CASE WHEN TO_CHAR(1) IN ('1', '2', '3', '4') THEN 1 ELSE 0 END AS Result
FROM DUAL


SELECT CASE WHEN instr('1, 2, 3, 4', '1') = 1 THEN 1 ELSE 0 END AS Result
FROM DUAL

SELECT CASE WHEN instr('11, 2, 3, 4', '1') = 1 THEN 1 ELSE 0 END AS Result
FROM DUAL

也许函数str2tbl(从字符串返回数字)将为您提供所需内容:

CREATE OR REPLACE TYPE number_ntt AS TABLE OF NUMBER;

CREATE OR REPLACE function str2tbl( p_str in varchar2 ) return NUMBER_NTT
as
       l_str   long default p_str || ',';
        l_n        number;
        l_data    NUMBER_NTT := NUMBER_NTT();
    begin
        loop
            l_n := instr( l_str, ',' );
            exit when (nvl(l_n,0) = 0);
           l_data.extend;
           l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
           l_str := substr( l_str, l_n+1 );
       end loop;
       return l_data;
   end;
/

select column_value num_val from THE (select cast( str2tbl('1, 2, 3, 4') as number_ntt) num_val from dual) --where column_value =1

答案 3 :(得分:2)

实现这一目标的最古老技术之一是使用LIKE:

with t as
(
  select replace('1, 2, 3, 4', ' ', '') text from dual
)
select case
         when ',' || text || ',' like '%,1,%' then 1
         else 0
       end result
  from t;

我从字符串中删除了不必要的空格,而不是通过在两个字符串的开头和结尾添加逗号进行比较(为了消除包含1但不是1:10,11的数字,必须这样做) 21 ...)。

或者说得更清楚:

select 1
  from dual
 where ',1,2,3,4,' like '%,1,%';