Я бы использовал старый SUBSTR, а не REGEXP. Поскольку REGEXP будет занимать слишком много ресурсов ЦП.
Ваше требование довольно простое.
Для данных как Chapter 18 Unit 10 Sect 16
, если вы хотите, чтобы Глава 18 была выводом:
Просто выполните:
Select substr(column, 1, 10) from table
Аналогично можно сделать и для других выходов.
Редактировать: Ребята, некоторые из вас могут подумать, почему я акцентирую внимание на старом добром SUBSTR, а не на REGEXP. Просто включите трассировку и посмотрите на вывод трассировки. Я согласен, что в более новых версиях Oracle значительно улучшила REGEXP. Но до настоящего времени я не видел случая, чтобы я остался доволен. Я могу ошибаться, поэтому, если у кого-то есть тестовый пример, я бы очень хотел его увидеть. Это было бы хорошим уроком для всех нас.
Неправильное обновление, чтобы показать приведенный выше тестовый пример о РЕГУЛЯРНОМ ВЫРАЖЕНИИ быстрее, чем SUBSTR + INSTR!
РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ:
SQL> DECLARE
2 l_start NUMBER := dbms_utility.get_cpu_time;
3 BEGIN
4 FOR i IN (WITH t
5 AS (SELECT 'Chapter '
6 || LEVEL
7 || ' Unit '
8 || LEVEL
9 || ' Sect '
10 || LEVEL d
11 FROM dual
12 CONNECT BY ROWNUM < 100000)
13 SELECT Regexp_substr(d, 'Chapter [0-9]*') chapter,
14 Regexp_substr(d, 'Unit [0-9]*') unit,
15 Regexp_substr(d, 'Sect [0-9]*') sect
16 FROM t) LOOP
17 NULL;
18 END LOOP;
19
20 dbms_output.Put_line('time taken by REGULAR EXPRESSION : '
21 || ( dbms_utility.get_cpu_time - l_start )
22 || ' hsec');
23 END;
24
25 /
time taken by REGULAR EXPRESSION : 61 hsec
PL/SQL procedure successfully completed.
SUBSTR + INSTR:
SQL> DECLARE
2 l_start NUMBER := dbms_utility.get_cpu_time;
3 BEGIN
4 FOR i IN (WITH t
5 AS (SELECT 'Chapter '
6 || LEVEL
7 || ' Unit '
8 || LEVEL
9 || ' Sect '
10 || LEVEL d
11 FROM dual
12 CONNECT BY ROWNUM < 100000)
13 SELECT Substr(d, 1, Instr(d, ' ', 1, 2) - 1)
14 chapter,
15 Substr(d, Instr(d, ' ', 1, 2),
16 Instr(d, ' ', 1, 4) - Instr(d,
17 ' ', 1, 2))
18 unit,
19 Substr(d, Instr(d, ' ', 1, 4), Length(d) - Instr(d, ' ', 1,
20 4)
21 + 1)
22 sect
23 FROM t) LOOP
24 NULL;
25 END LOOP;
26
27 dbms_output.Put_line('time taken by SUBSTR + INSTR : '
28 || ( dbms_utility.get_cpu_time - l_start )
29 || ' hsec');
30 END;
31
32 /
time taken by SUBSTR + INSTR : 28 hsec
PL/SQL procedure successfully completed.
Итак, ясно видно, что SUBSTR + INSTR заняло вдвое меньше времени, чем РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ.
10.09.2014