Как убрать символы из предложения в Oracle? - PullRequest
1 голос
/ 14 марта 2019

В Oracle база данных У меня есть такая таблица.

| TREE                            | ORG_NAME |
|---------------------------------|----------|
| \Google earth\Nest global\ATAP  | ATAP     |
| \Google earth\Nest\Beemoney\    | Beemoney |
| \Google\\\BeeKey\               |          |
|                                 | York     |

Я пытаюсь сделать SQL-запрос, который бы возвращал такой результат.

| ORGANIZATION                      |
|-----------------------------------|
| Google earth > Nest global > ATAP |
| Google earth > Nest Beemoney      |
| Google > BeeKey                   |
| York                              |

Как видите, я хочу:

1) Заменить символ \ в начале и конце предложения.

2) Заменить символ \ внутри предложения на символ >.

3) Заменить символ \\\, который находится внутри предложения, на символ >.

4) Если TREE colomn пуст, взять запись из ORG_NAME colomn.

Вот как я начал. Этот 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
    )
)

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Это может быть способ с regexp_replace и trim удалить символы из начала и конца строки:

select nvl(regexp_replace( trim('\' from tree), '\\+', ' > '), org_name)
from yourTable
2 голосов
/ 14 марта 2019

Вот рабочее решение, которое использует два вызова regexp_replace:

select
    regexp_replace(
        regexp_replace('\Google\\\BeeKey\', '^\\?(.*?)\\?$', '\1'), '\\+', ' > ')
from dual;

Google > BeeKey

Демонстрация

Внутренний вызов regexp_replace удаляет любые возможные разделители переднего или заднего тракта.Внешний вызов преобразует любое количество внутренних разделителей пути / в > в качестве замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...