首页 文章

仅使用WHERE子句组合LIKE和IN

提问于
浏览
3

我知道这个问题已被问到,但我对它的描述略有不同 . 我有一个用例,我唯一能控制的是查询的WHERE子句,我有2个表 .

用简单的例子:

Table1包含1列名为"FULLNAME"的列,其中包含数百个值
表2包含1列名为"PATTERN"的列,其中包含一些匹配的文本

所以,我需要做的是从表1中选择与表2中的值匹配的所有值 .

这是一个简单的例子:

表1(全名)
南极洲
安哥拉
澳大利亚
非洲
印度
印度尼西亚

表2(PATTERN)
一个

我需要的是Table1中包含Table2值的结果(结果将是ANTARCTICA,ANGOLA,INDIA,INDONESIA)

换句话说,我需要的是:

从Table1中选择* FULLNAME IN LIKE(从表2中选择'%'|| Pattern ||'%')

这里棘手的是我只能控制where子句,我根本无法控制Select子句或添加连接,因为我使用的产品只允许控制where子句 . 我也不能使用存储过程 .

这可能吗?

我正在使用Oracle作为后端数据库

谢谢

4 回答

  • 3

    如果模式总是两个字符,并且只需匹配全名的开头,就像您展示的示例一样,您可以:

    Select * from Table1 where substr(FULLNAME, 1, 2) IN (Select Pattern from Table2)
    

    这可以防止使用Table1上的任何索引,并且您的实际案例可能需要更灵活...

    或者甚至可能效率更低,类似于TomH的方法,但是在子查询中加入:

    Select * from Table1 where FULLNAME IN (
      Select t1.FULLNAME from Table1 t1
      Join Table2 t2 on t1.FULLNAME like '%'||t2.Pattern||'%')
    
  • 2

    一种可能的方法是在子查询中使用 EXISTSLIKE

    select * from table1 t1 
    where exists (select null 
                  from table2 t2 
                  where t1.fullname like '%' || t2.pattern || '%');
    
  • 2

    我相信你可以用一个简单的 JOIN 来做到这一点:

    SELECT DISTINCT
        fullname
    FROM
        Table1 T1
    INNER JOIN Table2 T2 ON T1.fullname LIKE '%' || T2.pattern || '%'
    

    DISTINCT 用于那些可能与 Table2 中的多行匹配的情况 .

  • 0

    对,这涉及一些诡计 . 从概念上讲,我所做的是将列从PATTERN转换为单个单元格,并将其与REGEX_LIKE一起使用

    因此值“AN和IN”变为单个值'(AN | IN)' - 我只是将它提供给regexp_like

    SELECT FULLNAME from table1  where  
    regexp_like(FULLNAME,(SELECT '(' || SUBSTR (SYS_CONNECT_BY_PATH (FULLNAME  , '|'), 2) || ')' Table2
              FROM (SELECT FULLNAME , ROW_NUMBER () OVER (ORDER BY FULLNAME) rn,
                           COUNT (*) OVER () cnt
                      FROM Table2)
             WHERE rn = cnt START WITH rn = 1 CONNECT BY rn = PRIOR rn + 1))
    

    regexp_like中的子查询将列转换为包含正则表达式字符串的单个单元格 .

    我确实意识到这可能是一个性能杀手,但幸运的是,我不是那时对性能感到不满

相关问题