выберите строку после секунды до последнего вхождения символа - PullRequest
0 голосов
/ 09 ноября 2018

Попытка выучить некоторые расширенные формулы Oracle Sql, У меня есть поле для клиента,
Родительский клиент: Child1 Клиент: Grandchild Клиент: GreatGrandchild Клиент

Мне нужна формула, которая просто даст мне

Клиент внука: Клиент GreatGrandchild

Поле может варьироваться между 3 или 4 отношениями, поэтому я хочу, чтобы данные только после второй до последней:

Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы можете сделать это через SUBSTR и INSTR следующим образом:

WITH your_table AS (SELECT 'Parent Customer : Child1 Customer : Grandchild Customer : GreatGrandchild Customer' your_field FROM dual)
SELECT your_field,
       SUBSTR(your_field, INSTR(your_field, ' : ', -1, 2) + 3) your_field_part
FROM   your_table;

YOUR_FIELD                                                                       YOUR_FIELD_PART
-------------------------------------------------------------------------------- ----------------------------------------------
Parent Customer : Child1 Customer : Grandchild Customer : GreatGrandchild Custom Grandchild Customer : GreatGrandchild Customer

Это работает, сначала находя позицию начала строки :, начиная с последнего символа (определяемого третьим параметром (-1), который, поскольку он отрицательный, указывает, что мы начинаем с первого символа из конец строки вместо начала), затем строка из этого символа + 3 (поскольку длина : составляет 3 символа) до конца строки.

0 голосов
/ 09 ноября 2018

Используйте комбинацию substr() и instr(). Instr дает вам числа, с которых начинается подстрока, такая как :, затем эти числа можно использовать в рамках substr в качестве параметров, чтобы вернуть только ту часть исходной строки, которая вам нужна. Instr также позволяет указать, какое вхождение этой подстроки (в качестве третьего параметра).

select
      instr(customer,':',1,1) first
    , instr(customer,':',1,2) second
    , instr(customer,':',1,3) third
    , substr(customer,instr(customer,':',1,2)+2) second_and_last_part
    , substr(customer,instr(customer,':',1,2)+2, instr(customer,':',1,3)-instr(customer,':',1,2)-2) second_last_part
    , substr(customer,instr(customer,':',1,3)+2) last_part
from  (
   select 'Parent Customer : Child1 Customer : Grandchild Customer : GreatGrandchild Customer' as customer from dual
   )

nb: использование +2, которое вы видите выше, связано с тем, что за позицией символа каждого : также следует пробел, поэтому, чтобы игнорировать оба, мы добавляем 2.

Просто смешайте и сопоставьте различные вызовы функций с различными параметрами, чтобы разделить исходную строку на части, как в запросе выше:

+-------+--------+-------+------------------------------------------------+--------------------------+----------------------+
| FIRST | SECOND | THIRD |              SECOND_AND_LAST_PART              |        LAST_PART         |   SECOND_LAST_PART   |
+-------+--------+-------+------------------------------------------------+--------------------------+----------------------+
|    17 |     35 |    57 | Grandchild Customer : GreatGrandchild Customer | GreatGrandchild Customer | Grandchild Customer  |
+-------+--------+-------+------------------------------------------------+--------------------------+----------------------+

INSTR (строка, подстрока [, start_position [, th_appearance]]) ref

SUBSTR (строка, начальная_позиция [, длина]) ref

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