Как найти точное совпадение строк в строке в Oracle - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть таблица оракула, в которой есть столбец system_access, в котором содержатся следующие данные:

Read Only, Write, read only, Admin
Read, Write, read only, Admin
Admin, Read Only (no), read only(see mgr), Admin

Исходя из приведенных выше примеров данных, я не уверен в своем запросе, чтобы получить только те записи, которые соответствуют точным словам "Только для чтения" и / или "Только для чтения"

Мне не нужны записи, в которых есть «Только для чтения (нет)» с пробелом и затем скобкой после него или перед ним или «Только для чтения (см. Мгр)» без пробелов и скобок после него или перед ним. *

Таким образом, основываясь на приведенных выше примерах данных, я получу только две строки, то есть:

Read Only, Write, read only, Admin
Read, Write, read only, Admin

Как уже упоминалось, только записи, которые точно соответствуют строке «Только чтение» или «Только чтение»

Ответы [ 6 ]

5 голосов
/ 05 ноября 2010

Иногда полезно добавить что-то в строку перед сравнением, тогда каждый элемент имеет одинаковый формат:

with testData as
(
  select 'Read Only, Write, read only, Admin' test from dual union all
  select 'Read, Write, read only, Admin'  test from dual union all
  select 'Admin, Read Only (no), read only(see mgr), Admin' test from dual
)
select * from testData
where lower(test)||',' like '%read only,%';
1 голос
/ 05 ноября 2010

взять @ Боб Джарвис (хотя я не мог заставить его работать с образцом данных, приведенным ниже) на один шаг дальше и опустить ИЛИ

WITH DATA AS(
SELECT '1- Read Only, Write, read only, Admin' SYSTEM_ACCESS FROM DUAL UNION
SELECT '2- Write, Admin,Read Only' SYSTEM_ACCESS FROM DUAL UNION
SELECT '3- Read, Write, read only, Admin' SYSTEM_ACCESS FROM DUAL UNION
select '4- ADMIN, READ ONLY (NO), READ ONLY(SEE MGR), ADMIN' system_access from dual 
)
select * 
  FROM DATA
 WHERE REGEXP_LIKE(SYSTEM_ACCESS, '(read only[ ,]+[^/(])|(read only$)','i');

REGEXP_LIKE (SYSTEM_ACCESS, '(только для чтения [,] + [^ / (]) | (только для чтения $)', 'i'); он будет искать все экземпляры «только для чтения», которые могут иметь пробел или запятую после него, но запрещают открытие (или «только для чтения» в конце строки.

(http://www.regular -expressions.info / oracle.html & http://psoug.org/snippet.htm/Regular_Expressions_Regex_Cheat_Sheet_856.htm?PHPSESSID=7238be874ab99d0731a9da64f2dbafd8)

0 голосов
/ 05 ноября 2010

Метод поиска "%read only,%" в ответе @ jonearles будет работать нормально. Однако из-за явно сумасшедшего базового дизайна, с которым вы работали, может быть целесообразно добавить немного строгости в тест разрешений.

Я бы соблазнился предположить, что у вас всегда есть строка, разделенная запятыми, и при выполнении проверки прав доступа анализируйте текст и проверяйте наличие определенных записей «Только чтение» и «Только чтение».

Вы также можете расширить это, проверяя каждый токен в проанализированной строке разрешения на соответствие таблице, содержащей известный набор ролей, то есть «Только чтение», «Только чтение (см. Mgr)». Эта таблица может даже содержать флаг, соответствующий вашему определению «Только для чтения», который вы можете использовать в своем запросе.

0 голосов
/ 05 ноября 2010
select * from table where lower(system_access) like '%read only,%';

Это будет работать до тех пор, пока данные таблицы не изменятся. Использование REGEX также будет работать, но регулярное выражение должно быть создано правильно и снова, если данные изменяют все это просто так.

0 голосов
/ 05 ноября 2010

Попробуйте

SELECT *
  FROM TABLE
  WHERE REGEXP_LIKE(system_access, '[^()]. read only. [^()],', 'i') OR
        REGEXP_LIKE(system_access, '[^()]. read only. [^()]$', 'i');

Я думаю, что это будет работать для показанных данных, но уже поздно, я далеко не гуру регулярных выражений, и у меня нет под рукой документов.

Делись и наслаждайся.

0 голосов
/ 05 ноября 2010

выберите * из таблицы, где нижний (trim (column_name)) = «только для чтения»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...