【问题标题】:Can we use SELECT as an argument to REGEXP_LIKE?我们可以使用 SELECT 作为 REGEXP_LIKE 的参数吗?
【发布时间】:2019-06-12 07:39:08
【问题描述】:

我有两张桌子 - Table1 和 Table2。

Table1 - 包含正则表达式模式。

Table2 - 包含文件名。

目的是从 Table2 中获取文件名与给定正则表达式模式匹配的行。

这很好用:

SELECT COLUMN2 FROM TABLE2 WHERE REGEXP_LIKE (FILE_NAME, 'PATTERN', 'i');

但是,PATTERN 需要从 Table1 中获取

所以,我尝试了:

SELECT COLUMN2 FROM TABLE2 WHERE REGEXP_LIKE (FILE_NAME, SELECT PATTERN FROM TABLE1, 'i');

似乎不支持此构造,或者我在这里遗漏了一些明显的东西。

任何建议/指针都会有很大帮助!

【问题讨论】:

  • 试试 REGEXP_LIKE (FILE_NAME, (SELECT PATTERN FROM TABLE1), 'i') - 但要确保 TABLE1 正好有一行。
  • @WernfriedDomscheit 这有帮助。我想知道我是如何错过尝试这个构造的。感谢您快速准确的回复。

标签: sql regex oracle subquery regexp-like


【解决方案1】:

您需要将嵌套查询用圆括号括起来:

SELECT COLUMN2
FROM   TABLE2
WHERE  REGEXP_LIKE ( FILE_NAME, ( SELECT PATTERN FROM TABLE1 ), 'i' );

这仅在嵌套查询返回您可能需要使用的单行时才有效:

SELECT COLUMN2
FROM   TABLE2
WHERE  REGEXP_LIKE (
         FILE_NAME,
         ( SELECT PATTERN FROM TABLE1 WHERE unique_field = 'some value' ),
         'i'
       );

如果查询将返回多行,那么您可能需要使用连接:

SELECT t1.PATTERN,
       t2.COLUMN2
FROM   TABLE1 t1
       INNER JOIN TABLE2 t2
       ON ( REGEXP_LIKE ( t2.FILE_NAME, t1.PATTERN, 'i' ) );

【讨论】:

    【解决方案2】:

    加盟怎么样?

    SQL> with
      2  table1 (pattern) as
      3    (select 'a' from dual union all
      4     select 'b' from dual
      5    ),
      6  table2 (file_name, column2) as
      7    (select 'Littlefoot', 'Not OK' from dual union all
      8     select 'Croatia'   , 'OK'     from dual
      9    )
     10  select b.file_name, b.column2
     11  from table2 b join table1 a on 1 = 1
     12  where regexp_like(b.file_name, a.pattern, 'i');
    
    FILE_NAME  COLUMN
    ---------- ------
    Croatia    OK
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多