Oracle запрос на сопоставление значений - PullRequest
0 голосов
/ 20 января 2020

У меня есть таблица DOCUMENT с именами столбцов ID_DOCUMENT и FILE_NAME.

Я хочу найти в таблице строки, для которых FILE_NAME следует этому шаблону: VA_#NP#_#NA#_#NNN#_#TXT#.

В примере я хотел бы найти файлы: VA_901085_000002_002_.txt и VA_901085_000002_003_.txt, поэтому файлы, имена которых начинаются с "VA" и заканчиваются на "_.txt"

ID_DOCUMENT       FILE_NAME

     1            VA_901085_000002_002_.txt
     2            VA_901085_000002_003_.txt
     3            VA_901085_000002_003.txt
     4            VA_902833_000001_001.pdf
     5            BT_049009-200811281247.pdf
   ...               ...

Я пробовал с этим запросом:

SELECT * FROM DOCUMENT WHERE FILE_NAME LIKE 'VA%' AND FILE_NAME LIKE'%_.txt';

Но запрос возвращает все файлы, начинающиеся с 'VA', и содержит txt. Где я ошибся?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Вы можете сопоставить регулярное выражение с regexp_like():

select * from document where regexp_like(file_name, '^VA_\d+_\d+_\d+_\.txt$')

Это определяет действительное имя файла, если оно соответствует следующему шаблону (полностью):

  • string 'VA'
  • , за которым следует подчеркивание (_), затем серия цифр (\d+)
  • , затем еще одно подчеркивание и серия цифр
  • одна снова и подчеркивание и цифры
  • наконец, подчеркивание и строка '.txt'
0 голосов
/ 20 января 2020

Как насчет SUBSTR?

SQL> WITH test (id, name)
  2       AS (SELECT 1, 'VA_901085_000002_002_.txt' FROM DUAL
  3           UNION ALL
  4           SELECT 2, 'VA_901085_000002_003_.txt' FROM DUAL
  5           UNION ALL
  6           SELECT 3, 'VA_901085_000002_003.txt' FROM DUAL
  7           UNION ALL
  8           SELECT 4, 'VA_902833_000001_001.pdf' FROM DUAL
  9           UNION ALL
 10           SELECT 5, 'BT_049009-200811281247.pdf' FROM DUAL)
 11  SELECT *
 12    FROM test
 13   WHERE     SUBSTR (name, 1, 2) = 'VA'
 14         AND SUBSTR (name, -5) = '_.txt';

        ID NAME
---------- --------------------------
         1 VA_901085_000002_002_.txt
         2 VA_901085_000002_003_.txt

SQL>

Проблема в вашем коде заключается в том, что вы использовали подчеркивание _, которое является подстановочным символом поиска (так же, как %), но которое используется только для одного персонажа. Это означает, что вы должны убежать это (см. Строку № 14):

SQL> WITH test (id, name)
  2       AS (SELECT 1, 'VA_901085_000002_002_.txt' FROM DUAL
  3           UNION ALL
  4           SELECT 2, 'VA_901085_000002_003_.txt' FROM DUAL
  5           UNION ALL
  6           SELECT 3, 'VA_901085_000002_003.txt' FROM DUAL
  7           UNION ALL
  8           SELECT 4, 'VA_902833_000001_001.pdf' FROM DUAL
  9           UNION ALL
 10           SELECT 5, 'BT_049009-200811281247.pdf' FROM DUAL)
 11  SELECT *
 12    FROM test
 13   WHERE     NAME LIKE 'VA%'
 14         AND (name LIKE '%?_.txt' ESCAPE '?');

        ID NAME
---------- --------------------------
         1 VA_901085_000002_002_.txt
         2 VA_901085_000002_003_.txt

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