Oracle SQL - анализ строки имени и преобразование ее в имя, фамилию и имя - PullRequest
1 голос
/ 16 декабря 2008

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

Мне нужно все в нижнем регистре с более низким ()
Найти запятую и отследить ее целочисленное значение местоположения
Получите первый символ после запятой и поместите его перед строкой
Затем получите полную фамилию и вставьте ее после первой буквы.

Sidenote - функция instr () не совместима с моей версией

Спасибо за любую помощь!

Ответы [ 5 ]

2 голосов
/ 02 января 2009

Лучший способ сделать это - использовать функцию Oracle Regular Expressions, например:

SELECT LOWER(regexp_replace('Smith, John R', 
             '(.+)(, )([A-Z])(.+)', 
             '\3\1', 1, 1)) 
  FROM DUAL;

Это означает, что: 1) когда вы найдете шаблон любого набора символов, за которым следует «,», за которым следует заглавная буква, за которой следуют оставшиеся символы, возьмите третий элемент (инициал имени) и добавьте Фамилия. Затем сделайте все строчными.

Примечание: "функция instr () не совместима с моей версией" не имеет смысла для меня, так как эта функция существует уже целую вечность. Проверьте свою версию, поскольку регулярные выражения были добавлены в Oracle только в версии 9i.

Спасибо за баллы.

- тушеное мясо

2 голосов
/ 16 декабря 2008

Начните с написания собственной функции INSTR - например, назовите ее my_instr. Он начнется с символа 1 и будет повторяться до тех пор, пока не найдет ','.

Тогда используйте, как вы бы INSTR.

1 голос
/ 22 декабря 2008

Нет необходимости создавать свою собственную функцию, и, честно говоря, кажется, что это пустая трата времени, когда это можно сделать довольно легко с уже существующими функциями 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;  

НТН, Гейб

1 голос
/ 18 декабря 2008

Мне трудно поверить, что у вас нет доступа к надлежащему 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;

Кроме того, будьте осторожны с предположением, что все имена будут в этом формате. Следите за чем-то, кроме пробела после запятой, фамилии с такими данными, как «Parisi, Jr.» и т. Д.

1 голос
/ 17 декабря 2008

instr () не совместим с вашей версией чего? Oracle? Вы используете версию 4 или что-то?

...