Как удалить символы из предложения в Oracle?

#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 удаляет все возможные разделители начального или конечного пути. Внешний вызов преобразует любое количество разделителей внутреннего пути / в > разделители в качестве замены.