#sql #oracle #oracle10g
#sql #Oracle #оракул10g
Вопрос:
У меня возникли проблемы с разделением строки переменной длины с пробелами, содержащей имена в oracle 10g.Ниже приведены несколько примеров того, что я имею в виду
1. Name : Alpha Beta First_Name : Alpha Last_Name : Beta 2. Name : Alpha Beta Gamma First_Name : Alpha Middle_Name : Beta Last_Name : Gamma 3. Name : Alpha Beta Gamma Omega First_Name : Alpha Middle_Name : Beta Last_Name : Gamma Omega
Спасибо.
Ответ №1:
Oracle 10g? Это старик.
SQLgt; with test (id, name) as 2 (select 0, 'Alpha' from dual union all 3 select 1, 'Alpha Beta' from dual union all 4 select 2, 'Alpha Beta Gamma' from dual union all 5 select 3, 'Alpha Beta Gamma Omega' from dual 6 ) 7 select id, 8 substr(name, 1, case when instr(name, ' ') = 0 then length(name) 9 else instr(name, ' ') - 1 10 end 11 ) first_name, 12 -- 13 substr(name, instr(name, ' ') 1, 14 instr(name, ' ', 1, 2) - instr(name, ' ') - 1 15 ) middle_name, 16 -- 17 case when instr(name, ' ') = 0 then null 18 else substr(name, instr(name, ' ', 1, case when instr(name, ' ', 1, 2) = 0 then 1 19 else 2 20 end) 1) 21 end last_name 22 from test; ID FIRST_NAME MIDDLE_NAME LAST_NAME ---------- --------------- --------------- --------------- 0 Alpha 1 Alpha Beta 2 Alpha Beta Gamma 3 Alpha Beta Gamma Omega SQLgt;
Что он делает? Выполняет поиск пробелов в name
столбце и извлекает значения, как вы описали. В этом нет ничего особенного, за исключением — возможно — last_name
того, что тоже имеет case
выражение. Он проверяет, существует ли 2-й пробел или нет; если нет, то подстрока после 1-го пробела-это фамилия; в противном случае подстрока после 2-го пробела-это фамилия.
Комментарии:
1. Огромное спасибо. Это сработало
2. Если имя содержит только одно слово, как его можно сопоставить только с именем . Прямо сейчас это переходит к фамилии
3. Это потому, что вы не сказали, что есть такая возможность 🙂 Я отредактировал ответ; взгляните, пожалуйста.
Ответ №2:
Вы можете использовать некоторые функции регулярных выражений в версии Oracle DB 10g, такие как REGEXP_INSTR()
и REGEXP_SUBSTR()
:
WITH t(id,name) AS (SELECT 1,'Alpha Beta' FROM dual UNION ALL SELECT 2,'Alpha Beta Gamma' FROM dual UNION ALL SELECT 3,'Alpha Beta Gamma Omega' FROM dual) SELECT id, REGEXP_SUBSTR(name, '([^ ] )', 1, 1) AS First_Name, CASE WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) gt; 1 THEN REGEXP_SUBSTR(name, '([^ ] )', 1, 2) END AS Middle_Name, CASE WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) = 1 THEN REGEXP_SUBSTR(name, '([^ ] )', 1, 2) ELSE TRIM(REGEXP_SUBSTR(name, '(( .*) )',REGEXP_INSTR(name, ' ',1,2),1)) END AS Last_Name FROM t
Набор результатов :
ID | ИМЯ ПОЛЬЗОВАТЕЛЯ | ПРОМЕЖУТОЧНОЕ ИМЯ | ФАМИЛИЯ |
---|---|---|---|
1 | Альфа | Бета | |
2 | Альфа | Бета | Гамма |
3 | Альфа | Бета | Гамма Омега |
Комментарии:
1. Спасибо вам за ответ.