簡體   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