繁体   English   中英

Oracle SQL-解析名称字符串并将其转换为名字的名字和姓氏

[英]Oracle SQL - Parsing a name string and converting it to first initial & last name

有谁知道如何把这个字符串变成:“史密斯,约翰R”
放入此字​​符串:“ jsmith”?

我需要使用lower()小写所有内容
查找逗号在哪里并跟踪其整数位置值
获取该逗号后的第一个字符并将其放在字符串前面
然后获得整个姓氏,并将其粘贴在第一个名字首字母之后。

旁注-instr()函数与我的版本不兼容

谢谢你的帮助!

首先编写您自己的INSTR函数-例如,将其命名为my_instr。 它将从char 1开始并循环直到找到','。

然后像使用INSTR一样使用。

最好的方法是使用Oracle正则表达式功能,如下所示:

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

就是说:1)当您找到任何一组字符的模式,后跟“,”,后跟一个大写字符,再跟所有剩余的字符时,取第三个元素(名字的首字母缩写)并附加姓氏。 然后将所有内容都小写。

您的旁注:“ instr()函数与我的版本不兼容”对我来说没有意义,因为该函数存在已有很长时间了。 检查您的版本,因为正则表达式仅在版本9i中添加到Oracle。

谢谢你的观点。

- 炖

instr()与您的什么版本不兼容? 甲骨文? 您使用的是版本4还是什么版本?

我很难相信您没有访问适当的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.”等数据。

不需要创建自己的函数,坦率地说,使用已经存在的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,加布

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM