我试图用一个类似条款在SQL到匹配的一定的模式内Oracle。

我想做些这样的:

LIKE '[A-Z][A-Z][1-4]%'

但是.. 我不能使用regex因为这是在Oracle9i (regex支持在10g)。

我试图相匹配的东西,有两个字之前,然后一个数目1和4之间,无论。我已经试图,但这似乎不到工作。只有这样,我们已经能够得到它的工作是由做:

WHERE ...
LIKE '%1__' OR 
LIKE '%2__' OR 
LIKE '%3__' OR 
LIKE '%4__'

我不知道如果我会这样做是可能的或正确的方式,因为我从来没有尝试模式等条款。

任何帮助你可以得到将不胜感激。

有帮助吗?

解决方案

尝试这种情况:

SELECT c1
FROM   t1
WHERE  substr(c1,1,1) IN ('A','B','C','D',
                          'E','F','G','H',
                          'I','J','K','L',
                          'M','N','O','P',
                          'Q','R','S','T',
                          'U','V','W','X',
                          'Y','Z')
       AND substr(c1,2,1) IN ('A','B','C','D',
                              'E','F','G','H',
                              'I','J','K','L',
                              'M','N','O','P',
                              'Q','R','S','T',
                              'U','V','W','X',
                              'Y','Z')
       AND substr(c1,3,1) IN ('1','2','3','4')
/

如果你想也以匹配下字母,然后应用上()函数将2第一SUBSTR(): 例如。其中上部(SUBSTR(c1,1,1))在...

<强>性能

我测试了REGEXP_LIKE和没有查询的性能。正如你所看到没有REGEXP_LIKE函数的查询是快100%。 (请注意,两个querys做了软解析)

SQL> select count(*) from t1;                                                                                                                     

  COUNT(*)
----------
    458752

Elapsed: 00:00:00.02
SQL> set timing off;                                                                                                                                  
SQL> select count(*) from t1;                                                                                                                     

  COUNT(*)
----------
    458752

SQL> set timing on;                                                                                                                                   
SQL> select count(*) from t1 where regexp_like(c1, '[A-Z][A-Z][1-4].*');                                                                       

  COUNT(*)
----------
     65536

Elapsed: 00:00:02.66
SELECT count(*)
FROM   t1
WHERE  substr(c1,1,1) IN ('A','B','C','D',
                          'E','F','G','H',
                          'I','J','K','L',
                          'M','N','O','P',
                          'Q','R','S','T',
                          'U','V','W','X',
                          'Y','Z')
       AND substr(c1,2,1) IN ('A','B','C','D',
                              'E','F','G','H',
                              'I','J','K','L',
                              'M','N','O','P',
                              'Q','R','S','T',
                              'U','V','W','X',
                              'Y','Z')
       AND substr(c1,3,1) IN ('1','2','3','4')
 18  /                                                                                                                                                

  COUNT(*)
----------
     65536

Elapsed: 00:00:01.15
SQL> 

<强>第二方法

获取的ASCII值A,Z,1和4

SQL> select ascii('A') from dual;                                                                                                                     

ASCII('A')
----------
        65


SQL> select ascii('Z') from dual;                                                                                                                     

ASCII('Z')
----------
        90


SQL> select ascii('1') from dual;                                                                                                                     

ASCII('1')
----------
        49

SQL> select ascii('4') from dual;                                                                                                                     

ASCII('4')
----------
        52

现在你可以写你的发言短了很多

SELECT count(* )
FROM   t1
WHERE  ascii(substr(c1,1,1)) BETWEEN 65 AND 90
       AND ascii(substr(c1,2,1)) BETWEEN 65 AND 90
       AND ascii(substr(c1,3,1)) BETWEEN 49 AND 52
/

其他提示

笨重,但也许:

select *
  from <your_table>
 where TRANSLATE(SUBSTR(<blah>,1,3),'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234',
                                    'AAAAAAAAAAAAAAAAAAAAAAAAAA1111') = 'AA1';

可能会满足您的需求....

编辑:通过@Hobo成立XLNT建议翻译的子串,而不是将转换后的字符串的子串...

我建议使用 INSTR

INSTR(t.column, '1', 3, 1) > 0 OR 
INSTR(t.column, '2', 3, 1) > 0 OR
INSTR(t.column, '3', 3, 1) > 0 OR
INSTR(t.column, '4', 3, 1) > 0

与在LIKE使用通配符的问题是有无法控制,其中在柱的值1/2/3/4 /等将要转起来。 - 它可能是在端部

DCookie是正确的 - 这个答案的有处理,如果有那个地方的数字数据的方法。但它仍然比使用LIKE使用通配符更好。

总野卡,但将建议。

你9i数据库安装有PL/SQL网的工具包,安装?因为要是我们的一个客户指出,有限的经常表达支持采用一个提供的软件包。

包装被称为owa_pattern和唯一的9i链接我能找到的是这个 一个

我从来没有使用它,我仍然想得到正视经常表达这样不能告诉你如果它会适合你的目的,但认为它可以使用。

如果你真的想使用REG EXPS你可以开发一个Java存储过程和伴随的PL / SQL包装。 (我假设在Oracle中9支持的Java版本支持REG EXPS,我不是100%确定)。您可以拨打通过PL / SQL包装,Java的存储过程中的SELECT语句。

但更容易和更快的:

SELECT c1
FROM   t1
WHERE  substr(c1,1,1) between  'A' and 'Z'
AND    substr(c1,2,1) between  'A' and 'Z'
AND    substr(c1,3,1) IN ('1','2','3','4')

的zürigschnäzlets的溶液而不使用ascci功能的变体。

我想你想使用的,而不是像REGEXP_LIKE。

WHERE REGEXP_LIKE(fieldName的, '[A-Z] {2} [1-4] +?', '我');

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top