我知道这个问题已被问到,但我对它的描述略有不同 . 我有一个用例,我唯一能控制的是查询的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 回答
如果模式总是两个字符,并且只需匹配全名的开头,就像您展示的示例一样,您可以:
这可以防止使用Table1上的任何索引,并且您的实际案例可能需要更灵活...
或者甚至可能效率更低,类似于TomH的方法,但是在子查询中加入:
一种可能的方法是在子查询中使用
EXISTS
和LIKE
:我相信你可以用一个简单的
JOIN
来做到这一点:DISTINCT
用于那些可能与Table2
中的多行匹配的情况 .对,这涉及一些诡计 . 从概念上讲,我所做的是将列从PATTERN转换为单个单元格,并将其与REGEX_LIKE一起使用
因此值“AN和IN”变为单个值'(AN | IN)' - 我只是将它提供给regexp_like
regexp_like中的子查询将列转换为包含正则表达式字符串的单个单元格 .
我确实意识到这可能是一个性能杀手,但幸运的是,我不是那时对性能感到不满