Проблем:
Искате да разделите низ в Oracle.
Пример:
Имате изречение и искате да го разделите с интервал.
Решение:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
Таблицата с резултатите изглежда така:
части |
---|
A |
пример |
изречение. |
Дискусия:
За да получите поднизове от низ, можете да използвате вградената функция REGEXP_SUBSTR() на Oracle. Необходими са четири аргумента:
- Низът, който трябва да се търси за подниз.
- Регулярният израз; т.е. моделът, който искате да намерите.
- Позицията, от която искате да започнете да търсите шаблона (стойността по подразбиране е 1, което означава, че започвате от началото на низа).
- Числото, което указва кое появяване на съответстващия подниз искате да видите (стойността по подразбиране е
1
, което означава, че трябва да се покаже първият съвпадащ подниз).
В нашия пример низът, който трябва да се търси, е 'An example sentence.
' В низа търсите поднизове, които са думи, които ние дефинираме тук като всякакви групи от всякакви знаци с изключение на интервали. Ето защо ние задаваме модела '[^ ]+
', т.е. всяка последователност от знаци без интервал. [^ ]
означава всеки знак с изключение на интервал и +
знак означава едно или повече поява на такива знаци. Третият аргумент трябва да бъде по подразбиране (1
), тъй като искате да търсите думи в целия низ от самото начало. Последният аргумент е най-трудният – трябва да промените стойността му за всеки низ, който ще бъде търсен. Трябва да е ниво – псевдоколона, налична в йерархични заявки с помощта на CONNECT BY
– което в нашия случай ще бъде равно на номера на реда на текущия ред в резултата, когато се използва CONNECT BY. И така, имате:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Този израз трябва да бъде избран от dual
– псевдотаблица, използвана в Oracle, когато не избирате от действителна таблица. След това трябва да CONNECT BY
оператора за йерархични заявки, при условие, че извлеченият подниз не трябва да е NULL
. Извлеченият подниз ще бъде NULL, след като всички думи бъдат извлечени; йерархичната заявка ще спре изпълнението. И така, имате:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Можете да прочетете тук за ниво и CONNECT BY.
Ако искате да разделите низа с друг разделител, можете лесно да промените заявката. Например, ако искате да разделите низа със запетая, променете '[^ ]
+“ до „[^,]+
'. Ето примерна заявка:
SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;