Oracle SQL - Разбор строки имени и преобразование ее в first инициал и фамилию

StackOverflow https://stackoverflow.com/questions/371490

  •  21-08-2019
  •  | 
  •  

Вопрос

Кто-нибудь знает, как повернуть эту строку:"Смит, Джон Р."
В эту строку:"джсмит" ?

Мне нужно записать все в нижнем регистре с помощью 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;

Кроме того, будьте осторожны с вашим предположением о том, что все имена будут в этом формате.Следите за чем-то другим, кроме одиночного пробела после запятой, фамилий, содержащих такие данные, как “Паризи-младший” и т.д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top