найти строку из значений с разделителями из значений с разделителями (Oracle PL-SQL) - PullRequest
0 голосов
/ 17 ноября 2011

Как можно написать запрос для базы данных Oracle, чтобы я мог найти список значений через запятую в столбце, который содержит список значений через запятую. Параметр:, передаваемый в оператор sql, также является значениями с разделителями-запятыми, выбранными пользователем.

Например, У нас есть столбец в таблицах, который содержит

1 | 'А', 'В', 'С'

2 | 'C', 'A'

3 | 'A', 'B'

в интерфейсе веб-приложения у нас есть поле множественного выбора, которое показывает В С и позволяет пользователю выбрать один или несколько элементов.

Я хочу, чтобы строки 1 и 2 отображались, если они выбирают A и B. Если они выбирают A, только все три должны отображаться b / c, все строки с 1 по 3 имеют значение 'A'.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Этот пример, как мы надеемся, поможет, и он соответствует значениям независимо от того, в каком порядке они появляются в строке в записи БД.

Создать пример таблицы:

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 голос
/ 17 ноября 2011

Вы можете использовать предложение 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...