Oracle SQL - Разбор строки имени и преобразование ее в first инициал и фамилию
Вопрос
Кто-нибудь знает, как повернуть эту строку:"Смит, Джон Р."
В эту строку:"джсмит" ?
Мне нужно записать все в нижнем регистре с помощью lower()
Найдите, где находится запятая, и отследите ее целочисленное значение местоположения
Возьмите первый символ после этой запятой и поместите его перед строкой
Затем возьмите фамилию целиком и вставьте ее после первой инициалы.
Функция Sidenote - instr() несовместима с моей версией
Спасибо за любую помощь!
Решение
Начните с написания своей собственной функции INSTR - назовите ее, например, my_instr.Он начнется с символа 1 и будет зацикливаться до тех пор, пока не найдет ','.
Затем используйте так, как вы бы ИНСТР.
Другие советы
Лучший способ сделать это - использовать функцию регулярных выражений Oracle, например, так:
SELECT LOWER(regexp_replace('Smith, John R',
'(.+)(, )([A-Z])(.+)',
'\3\1', 1, 1))
FROM DUAL;
В нем говорится: 1) когда вы найдете шаблон любого набора символов, за которым следует ", ", за которым следует символ верхнего регистра, за которым следуют любые оставшиеся символы, возьмите третий элемент (инициал имени) и добавьте фамилию.Затем сделайте все в нижнем регистре.
Ваше боковое примечание:"функция instr () несовместима с моей версией" для меня не имеет смысла, поскольку эта функция существует уже целую вечность.Проверьте свою версию, потому что регулярные выражения были добавлены в Oracle только в версии 9i.
Спасибо за замечания.
-- Тушеное мясо
instr() несовместим с вашей версией чего?Оракул?Вы используете версию 4 или что-то в этом роде?
Нет необходимости создавать свою собственную функцию, и, откровенно говоря, это кажется пустой тратой времени, когда это можно довольно легко сделать с помощью уже существующих функций sql.Необходимо соблюдать осторожность при неаккуратном вводе данных.
Вот еще один способ достичь вашей заявленной цели:
with name_list as
(select ' Parisi, Kenneth R' name from dual)
select name
-- There may be a space after the comma. This will strip an arbitrary
-- amount of whitespace from the first name, so we can easily extract
-- the first initial.
, substr(trim(substr(name, instr(name, ',') + 1)), 1, 1) AS first_init
-- a simple substring function, from the first character until the
-- last character before the comma.
, substr(trim(name), 1, instr(trim(name), ',') - 1) AS last_name
-- put together what we have done above to create the output field
, lower(substr(trim(substr(name, instr(name, ',') + 1)), 1, 1)) ||
lower(substr(trim(name), 1, instr(trim(name), ',') - 1)) AS init_plus_last
from name_list;
HTH, Гейб
Мне трудно поверить, что у вас нет доступа к надлежащему instr(), но если это так, внедрите свою собственную версию.
Предполагая, что вы это уладили:
select substr( lower( 'Smith, John R' ) , instr( 'Smith, John R', ',' ) + 2 , 1 ) || -- first_initial substr( lower( 'Smith, John R' ) , 1 , instr( 'Smith, John R', ',' ) - 1 ) -- last_name from dual;
Кроме того, будьте осторожны с вашим предположением о том, что все имена будут в этом формате.Следите за чем-то другим, кроме одиночного пробела после запятой, фамилий, содержащих такие данные, как “Паризи-младший” и т.д.