Во-первых, ваш стол не нормализуется. Вы должны хранить их в разных столбцах, а не хранить в одном столбце в виде строки с разделителями. Прочитайте Normalization. Это должно быть постоянное решение для исправления дизайна .
Во всяком случае, в качестве обходного пути, без изменения конструкции, вы могли бы сделать, как показано ниже:
Если шаблон фиксировано, то вы могли бы использовать SUBSTR.
SQL> WITH DATA(str) AS(
2 SELECT 'x=1;y=2;z=3' FROM dual UNION ALL
3 SELECT 'x=4;y=5;z=6' FROM dual
4 )
5 SELECT substr(str, 3, 1) a,
6 substr(str, 7, 1) b,
7 substr(str, 11, 1) c
8 FROM DATA;
A B C
- - -
1 2 3
4 5 6
SQL>
Обновление
Если шаблон не является фиксированным, а затем использовать SUBSTR и Instr.
SQL> WITH DATA(str) AS
2 (SELECT 'x=1;y=2;z=3' FROM dual
3 UNION ALL
4 SELECT 'x=4;y=5;z=6' FROM dual
5 UNION ALL
6 SELECT 'x=14;y=15;z=16;A=25' FROM dual
7 )
8 SELECT NVL(SUBSTR(str
9 ||';', instr(str
10 ||';', '=', 1, 1) +1, instr(str
11 ||';', ';', 1, 1) - instr(str
12 ||';', '=', 1, 1) -1), '0') a,
13 NVL(SUBSTR(str
14 ||';', instr(str
15 ||';', '=', 1, 2) +1, instr(str
16 ||';', ';', 1, 2) - instr(str
17 ||';', '=', 1, 2) -1), '0') b,
18 NVL(SUBSTR(str
19 ||';', instr(str
20 ||';', '=', 1, 3) +1, instr(str
21 ||';', ';', 1, 3) - instr(str
22 ||';', '=', 1, 3) -1), '0') c,
23 NVL(SUBSTR(str
24 ||';', instr(str
25 ||';', '=', 1, 4) +1, instr(str
26 ||';', ';', 1, 4) - instr(str
27 ||';', '=', 1, 4) -1), '0') d
28 FROM DATA;
A B C D
- - - -
1 2 3 0
4 5 6 0
1 1 1 2
4 5 6 5
Вы можете использовать регулярные выражения, который будет выглядеть более короткий код, однако, простой SUBTR и INSTR будет быстрее, чем регулярные выражения.
oracle версия? 10+? – Utsav
@Utsav yes correct –
Есть ли всегда только 3 значения? –