#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
Комментариев нет:
Отправить комментарий