Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Парсинг строки для разбиения на слова по пробелу

#sql #oracle


Не могу найти красивого решения для вычленения слов из строки. Например:

SELECT 'Фамилия' as Col_1,  Parse(FullName, ' ')[0] as FirstName,
       'Имя' as Col_2,      Parse(FullName, ' ')[1] as Name,
       'Отчество' as Col_3, Parse(FullName, ' ')[2] as Patronymic
FROM Students


Есть ли подобное в SQL вообще без написания своих хранимых функций?
    


Ответы

Ответ 1



Можно обойтись без регулярок, используя только substr и instr. Несмотря на свою неказистость, такое решение может показывать значительно более высокую скорость по сравнение с регулярками. with Students as ( select level id, 'fname'||level||' mname'||level||' lname'||level fullName from dual connect by level <= 3 ) select s.*, substr(s.fullName, 1, instr(s.fullName, ' ', 1, 1) - 1 ) as fName, substr(s.fullName, instr(s.fullName, ' ', 1, 1), instr(s.fullName, ' ', 1, 2) - instr(s.fullName, ' ', 1, 1) ) as mName, substr(s.fullName, instr(s.fullName, ' ', 1, 2) ) as lName from Students s

Ответ 2



Можно так: with Students as ( select level id, 'fname'||level||' mname'||level||' lname'||level fullName from dual connect by level <= 3 ), params as (select '(\w+)\s+(\w+)\s+(\w+)' namePattern from dual), studentNames as ( select id, regexp_replace (fullName, namePattern, '\1') fName, regexp_replace (fullName, namePattern, '\2') mName, regexp_replace (fullName, namePattern, '\3') lName from Students, params ) select * from studentNames ; ID FNAME MNAME LNAME ---------- ---------- ---------- ---------- 1 fname1 mname1 lname1 2 fname2 mname2 lname2 3 fname3 mname3 lname3

Ответ 3



Ответ на основаниии совета @Akina (только REGEXP_SUBSTR вместо REGEXP_REPLACE). SELECT REGEXP_SUBSTR(FULL_NAME,'[^ ]+',1,1) AS SURNAME ,REGEXP_SUBSTR(FULL_NAME,'[^ ]+',1,2) AS NAME ,REGEXP_SUBSTR(FULL_NAME,'[^ ]+',1,3) AS PATRONYMIC FROM STUDENTS

Комментариев нет:

Отправить комментарий