如何为Oracle数据库编写查询,以便我可以从包含逗号分隔值列表的列中找到以逗号分隔的值列表。传递给sql语句的:参数也是用户选择的逗号分隔值。
例如 我们在包含
的表中有一列1 | 'A', 'B', 'C'
2 | 'C', 'A'
3 | 'A', 'B'
在Web应用程序界面上,我们有多选框显示 一个 乙 C 并允许用户选择一个或多个项目。
如果他们选择A和B我想要显示第1行和第2行,如果他们选择A只有全部三个应该显示b / c所有行1到3都有'A'值。
答案 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'