SQL从字符串的右侧获取数字,而无需LIKE

时间:2018-07-18 20:53:55

标签: sql oracle sql-like substr

我需要此查询的解决方案,但不能使用LIKE语句。我想我可以使用INSTR和SUBSTR,但是我对它们不太熟悉。

通常,我只能执行类似'%7'的操作,但是我不能在这里进行操作。这样做的目的是取回数据库中在Column1中以7结尾的字符串的任何行的列表。还要注意的是,并非所有字符串的长度都相同,并且我使用的是Oracle SQL Developer 。我已经复制了如下的LIKE语句。

SELECT Column1, Column2 
FROM Table1
WHERE Column1 LIKE '%7'
ORDER BY Column2;

3 个答案:

答案 0 :(得分:2)

也许是这样吗?

SELECT x FROM t WHERE SUBSTR(x, -1) = '7'

答案 1 :(得分:1)

嗯,一个简单的解决方案是:

where regexp_like(x, '7$')

但是尚不清楚您是否可以使用该功能。

答案 2 :(得分:1)

只是为了补充我发现在大多数情况下更简单,足够好的其他解决方案。

使用以%开头的模式时,查询有时会非常缓慢。如果是出于性能问题,我将推荐一种性能更好的[overkill]解决方案,因为它使用索引范围扫描而不是全表扫描

  1. 创建一个存储过程以反转字符串:

    CREATE OR REPLACE PROCEDURE ReverseOf(input IN varchar2) IS
        rev varchar2(50):='';
    BEGIN
        FOR i in reverse 1..length(input) LOOP
                rev := rev||substr(input, i, 1);
        END LOOP;
        dbms_output.put_line(rev);
    END;
    
  2. 在表中创建一个虚拟列:

    alter table table1 add column reversed_column1 
      generated always as (ReverseOf(column1)) virtual;
    
  3. 在虚拟列上创建索引:

    create index ix_reverse_column1 on table1 (reversed_column1);
    
  4. 使用“反向赞”(非常快):

    SELECT Column1, Column2 
    FROM Table1
    WHERE reversed_column1 LIKE '7%' -- reverse pattern here!
    ORDER BY Column2;
    

也许过度杀伤力,但您可能需要它。去年对我有很大帮助。