Разделите строку переменной длины в oracle 10g

#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. Спасибо вам за ответ.