Oracle PL SQL STRING Функции - PullRequest
0 голосов
/ 19 июня 2020

У меня есть столбец, который содержит значения или строки в виде комбинации имени и кода, как показано ниже.

Data_Current

Column_X
---------------------------
Saint_Peter_King_Jr_0001
Kishore_Prasad_Misra_1253
George_Floyd_21543
Veer_Venkata_Sai_Narsimha_Kishore_00015

, и я хочу получить имя и код в другом столбце, но разделитель '_' и его вхождение (Количество и позиция) не одинаковы в каждой строке или значении, как показано выше.

Итак, как прочитать строку справа и извлечь имя и код, как показано ниже

Требуемый результат

Name                                    Code
---------------------------------------------
Saint_Peter_King_Jr                      0001
Kishore_Prasad_Misra                     1253
George_Floyd                            21543
Veer_Venkata_Sai_Narsimha_Kishore       00015

Я пробовал, но instr работает, но INSTR( string, substring [, start_position [, th_appearance ] ] ) но внешний вид не является постоянным и меняется в зависимости от имени. Как сделать это динам c?

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Метод regexp_substr. Оператор with просто устанавливает данные, мясо в select. Регулярные выражения обрабатывают то, что вы подразумеваете под динамическим c, то есть неизвестное количество символов кода и / или неизвестное количество чисел в коде. Скобки в регулярном выражении определяют захваченную группу, которая возвращается. Для имени - набор любых символов перед последним подчеркиванием, за которым следует 1 или более цифр, а для кода - набор из 1 или более цифр после любого количества любых символов и последнего символа подчеркивания.

WITH tbl(column_X) AS (
  SELECT 'Saint_Peter_King_Jr_0001' FROM dual UNION ALL
  SELECT 'Kishore_Prasad_Misra_1253' FROM dual UNION ALL
  SELECT 'George_Floyd_21543' FROM dual UNION ALL
  SELECT 'Veer_Venkata_Sai_Narsimha_Kishore_00015' FROM dual
)
SELECT 
  REGEXP_SUBSTR(column_X, '(.*?)_\d+', 1, 1, NULL, 1) AS NAME,
  REGEXP_SUBSTR(column_X, '.*?_(\d+)', 1, 1, NULL, 1) AS code
FROM tbl;

NAME                                    CODE                                   
--------------------------------------- ---------------------------------------
Saint_Peter_King_Jr                     0001                                   
Kishore_Prasad_Misra                    1253                                   
George_Floyd                            21543                                  
Veer_Venkata_Sai_Narsimha_Kishore       00015                                  

4 rows selected.
1 голос
/ 19 июня 2020

Ниже SQL используются Oracle встроенные функции INSTR и SUBSTR и предполагается, что «код» всегда является последней частью строки и ему всегда предшествует одиночный символ подчеркивания, например _

select substr('Veer_Venkata_Sai_Narsimha_Kishore_00015',1,instr('Veer_Venkata_Sai_Narsimha_Kishore_00015','_',-1) - 1) as NAME
      ,substr('Veer_Venkata_Sai_Narsimha_Kishore_00015',instr('Veer_Venkata_Sai_Narsimha_Kishore_00015','_',-1) + 1) as CODE
  from dual

Результат:

NAME                              CODE
--------------------------------- -----
Veer_Venkata_Sai_Narsimha_Kishore 00015

Обратите внимание, что вы можете заменить имя столбца, например Column_X, на строковый литерал .

0 голосов
/ 19 июня 2020

Вы не можете этого сделать с помощью встроенных функций. Вам придется написать свою собственную функцию, чтобы решать ее процедурно.

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