从分隔值的分隔值中查找字符串(Oracle PL-SQL)

时间:2011-11-17 13:54:38

标签: oracle plsql

如何为Oracle数据库编写查询,以便我可以从包含逗号分隔值列表的列中找到以逗号分隔的值列表。传递给sql语句的:参数也是用户选择的逗号分隔值。

例如 我们在包含

的表中有一列

1 | 'A', 'B', 'C'

2 | 'C', 'A'

3 | 'A', 'B'

在Web应用程序界面上,我们有多选框显示 一个 乙 C 并允许用户选择一个或多个项目。

如果他们选择A和B我想要显示第1行和第2行,如果他们选择A只有全部三个应该显示b / c所有行1到3都有'A'值。

2 个答案:

答案 0 :(得分:4)

这个例子有望帮助它,它与值匹配,而不管它们出现在DB记录的字符串中的顺序。

创建示例表:

CREATE TABLE t
(val VARCHAR2(100));

插入记录:

INSERT INTO t VALUES
('1|''A'',''B'',''C''');

INSERT INTO t VALUES
('2|''C'',''A''');

INSERT INTO t VALUES
('3|''A'',''B''');

检查值:

SELECT * FROM t;
1|'A','B','C'
2|'C','A'    
3|'A','B'

检查解决方案'A':

SELECT val
  FROM t
 WHERE REGEXP_LIKE(val, '(A)');
1|'A','B','C'   
2|'C','A'      
3|'A','B'

检查A和B的解决方案

SELECT val
  FROM t
 WHERE REGEXP_LIKE(val, '(A|B).*(A|B)');
1|'A','B','C'
3|'A','B'

如果您想确保结果的1|部分与任何内容不匹配,那么您可以使用以下方式进行查询:

SELECT val
  FROM t
 WHERE REGEXP_LIKE(val, '(.\|.*)(A)');

SELECT val
  FROM t
 WHERE REGEXP_LIKE(val, '(.\|.*)(A|B).*(A|B)');

希望这会有所帮助......

答案 1 :(得分:1)

您可以使用具有不同数量的绑定值的where子句,具体取决于所选选项的数量:

TEST@PRJ> create table t (c varchar2(100));
TEST@PRJ> insert into t values ('2 | ''C'',''A''');
TEST@PRJ> insert into t values ('3 | ''A'',''B''');
TEST@PRJ> select * from t where c like '%''A''%' and c like '%''B''%';

C
----------------------------------------------------------------------------------------------------------------
1 | 'A','B','C'
3 | 'A','B'

TEST@PRJ> select * from t where c like '%''A''%';

C
----------------------------------------------------------------------------------------------------------------
1 | 'A','B','C'
2 | 'C','A'
3 | 'A','B'

如果按顺序存储值,则可以使用单个绑定值:

TEST@PRJ> select * from t where c like '%''A''%''B''%';

C
-----------------------------------------------------------------------------------------
1 | 'A','B','C'
3 | 'A','B'