Попробуйте это:
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 первых зиЬзЬг(): например. где верхний (подстрока (c1,1,1)) в ...
Performance
Я протестировал производительность запроса с 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
/
Если бы я хотел сопоставить третьего символа перед номером, который мог бы или не был бы там, что бы я мог сделать со вторым методом (ASCII), чтобы это разрешить? – 2009-10-01 15:02:48
Просто сделайте WHERE substr (c1,1,1) между «A» и «Z» ... вместо того, где ascii (substr (c1,1,1)) МЕЖДУ 65 И 90. – tuinstoel
Надеюсь, это было не в меру вашего сравнительного тестирования. Некоторые из сбережений могут исходить из того, что ваши строки были в памяти из первого запроса. Кроме того, работает ли ASCII трюк с многобайтовыми наборами символов? Я не знаю, просто спрашиваю. – DCookie