在oracle select查询中替代

时间:2017-11-14 10:42:24

标签: sql oracle

我有一个单列表。  表T包含如下数据:

 A11
B1
As112
DF123
VG112

我正在寻找替代品(VG%和DF%)...因为我认为如果有更多比较它可能会影响性能

2 个答案:

答案 0 :(得分:1)

以下是您可以尝试的一些替代方案。如果在where子句(substr)中具有特定于这些表达式的基于函数的索引,则性能可能会提高。

select * FROM t where SUBSTR(data,1,2) = 'VG'; -- If you are always comparing first 2 characters.

select * FROM t where SUBSTR(data,1,2) IN (  'VG' , 'DF');  -- Multiple comparisions

INSTR是另一种选择,但您不能拥有适合此比较的索引。

select * FROM t where INSTR(data,'VG') = 1; 

答案 1 :(得分:0)

我认为like是最佳选择。您可以创建模式列表并使用join,如下所示:

select * from t join p on t.text like p.pattern||'%' 

如果您使用内置类型odcivarchar2list或使用union all定义模式无关紧要,则只会缩短语法。

示例:

with t(text) as (
    select column_value 
      from table(sys.odcivarchar2list('A11', 'B1', 'As112', 'DF123', 'VG112'))),
p(pattern) as (
    select column_value 
      from table(sys.odcivarchar2list('DF', 'VG')))
select * 
  from t join p on t.text like p.pattern||'%' 

TEXT    PATTERN
------  -------
DF123   DF
VG112   VG