我试图在逗号分隔字符串中找到一个数字(ID)。 我尝试使用Select,但没有工作。 我可以使用另一种方法吗?
SELECT CASE WHEN TO_CHAR(1) IN ('1, 2, 3, 4') THEN 1 ELSE 0 END AS Result
FROM DUAL
我总是得到' 0' 。有谁可以请帮助。
答案 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,%';