首页 > 解决方案 > Oracle 查询值匹配模式

问题描述

我有一个DOCUMENT包含列名ID_DOCUMENTFILE_NAME.

我想在表中找到FILE_NAME遵循这种模式的行:VA_#NP#_#NA#_#NNN#_#TXT#.

在示例中,我会找到文件:VA_901085_000002_002_.txtVA_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 的文件。我哪里出错了?

标签: sqloracle

解决方案


怎么样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>

推荐阅读