我在单个字段中有一个逗号分隔值的列表,需要找到满足特定条件的所有行。我使用的代码是:
select * from table where column_name in
(
select regexp_substr('A+','A-','aabn','[^,]+', 1,level) from table
connect by regexp_substr('A+','A-','aabn', '[^,]+', 1,level) is not null
);
所以我想找到所有包含 A+、A- 和 aabn 的行
为什么不只使用单个正则表达式?
where regexp_like(column_name, '(^|,)(A[+]|A[-]|aabn)($|,)')
这是一个DB<>小提琴。
此外,尽管正则表达式功能强大,但不应在单个字符串中存储多个值。 Oracle 还有许多其他选项用于存储多个值,包括传统的关联/联结表。
你不需要正则表达式,只需使用LIKE
来检查你需要的值是否是列的子字符串(两者都用分隔符包围(:
如果您想要列表中的所有 3 个,请使用AND
:
SELECT *
FROM table_name
WHERE ',' || column_name || ',' LIKE '%,A+,%'
AND ',' || column_name || ',' LIKE '%,A-,%'
AND ',' || column_name || ',' LIKE '%,aabn,%'
如果您希望列表中的任何 1,请使用OR
:
SELECT *
FROM table_name
WHERE ',' || column_name || ',' LIKE '%,A+,%'
OR ',' || column_name || ',' LIKE '%,A-,%'
OR ',' || column_name || ',' LIKE '%,aabn,%'