#sql #database #oracle
#sql #База данных #Oracle
Вопрос:
В базе данных Oracle у меня есть такая таблица.
| TREE | ORG_NAME |
|---------------------------------|----------|
| Google earthNest globalATAP | ATAP |
| Google earthNestBeemoney | Beemoney |
| Google\BeeKey | |
| | York |
Я пытаюсь выполнить sql-запрос, который вернул бы такой результат.
| ORGANIZATION |
|-----------------------------------|
| Google earth > Nest global > ATAP |
| Google earth > Nest Beemoney |
| Google > BeeKey |
| York |
Как вы можете видеть, я хочу:
1) Замените
символ в начале и конце предложения.
2) Замените
символ, который находится внутри предложения, на >
symbol.
3) Замените \
символ, который находится внутри предложения, на >
symbol.
4) Если TREE
столбец пуст, возьмите запись из ORG_NAME
столбца.
Вот как я начал. Этот SQL-запрос решает 2, 3 и 4 части. Как решить проблему с 1 частью. Я думаю, мне нужно использовать REGEXP_REPLACE
, верно? Как сделать это правильно? Есть ли другой, более элегантный способ перепроектировать sql-запрос? Как вы можете видеть, я прохожу по одной и той же таблице несколько раз.
SELECT
COALESCE (TREE, ORG_NAME) as ORGANIZATION
FROM (
SELECT
REPLACE(TREE, '', '>') AS TREE,
ORG_NAME
FROM (
SELECT
REPLACE(TREE, '\', '>') AS TREE,
ORG_NAME
FROM
ORG
)
)
Ответ №1:
Это может быть способ с помощью a regexp_replace
и a trim
удалить символы из начала и конца строки:
select nvl(regexp_replace( trim('' from tree), '\ ', ' > '), org_name)
from yourTable
Комментарии:
1. Большое вам спасибо! Могу я задать вам еще один вопрос? Возможно ли также заменить
t
(tab
) также на>
symbol?2. Простым способом могло бы быть обертывание этого с помощью replace, учитывая, что chr (9) является символом табуляции
3. Например, как добавить такую логику в ваш код
SELECT REPLACE(TREE, chr(9), ' > ') FROM ORG;
?4. Вам нужно обернуть часть, которую я написал; поэтому что-то вроде
REPLACE(nvl(regexp_replace( trim('' from tree), '\ ', ' > '), org_name), chr(9), ' > ')
Ответ №2:
Вот рабочее решение, которое использует два вызова regexp_replace
:
select
regexp_replace(
regexp_replace('Google\BeeKey', '^\?(.*?)\?$', '1'), '\ ', ' > ')
from dual;
Google > BeeKey
ДЕМОНСТРАЦИЯ
Внутренний вызов regexp_replace
удаляет все возможные разделители начального или конечного пути. Внешний вызов преобразует любое количество разделителей внутреннего пути /
в >
разделители в качестве замены.