2017-07-06 89 views
-1

我有一個表,在它的名字,它看起來像這樣:拆分名稱字段在Oracle中爲第一和姓

Emp_ID  Emp_Name 
0001  Jack Skelly 
0002  Susan Ryan 

我需要生產的東西,看起來像這樣:

Emp_ID Emp_F_Name Emp_L_Name 
0001  Jack   Skelly 
0002  Susan   Ryan 

我想出這個分裂的名字:

SubStr(d.Name, 0, InStr(d.Name, ' ')-1) as FName, 
SubStr(d.Name, InStr(d.Name, ' ')+1) as LName 

我見過的人建議我NSTR,我見過人們建議regexp_instr,我見過他們建議regexp_substr。我對Oracle還是一個新手,我也不太瞭解,或者哪個(如果其中的一個)對於我需要做的分割更有效。有人能告訴我關於分裂這個領域的最好方法嗎?我已經使用了最好/最有效的方法來處理我想要做的事情嗎?

+0

所有的名字都是格式(字母串)+(空格)+(字母串)嗎?在大多數情況下,這是不正確的。你對John Clayton Stuart或Ali Abu Ahmad這樣的名字有什麼作用?名字是什麼?什麼是姓氏? – mathguy

+0

姓氏是連字符號,無論他們是否正常拼寫。 –

+0

我提供的解決方案在字符串的第一個空格分割。 – mathguy

回答

0

substrinstr幾乎總是比正則表達式函數更快/更有效。

INSTR用於查找輸入字符串中空格的位置。 SUBSTR用於從輸入字符串中提取子字符串。搜索(谷歌)這些功能的Oracle文檔 - 您將找到詳細的解釋和示例。

您遇到的問題更大的問題是業務需求 - 您如何處理名爲「John Clayton Stuart」,「Ali Abu Ahmad」或單詞「Belphegor」等?

下面的查詢顯示如何輕鬆地解決問題如果所有名稱的格式爲「名字姓氏」。

with 
    input_table (emp_id, emp_name) as (
     select '0001', 'Jack Skelly' from dual union all 
     select '0002', 'Susan Ryan' from dual 
    ) 
-- End of simulated input data (not part of the solution). 
-- SQL query begins BELOW THIS LINE. 
select emp_id, emp_name, 
     substr(emp_name, 1, instr(emp_name, ' ') - 1) as first_name, 
     substr(emp_name, instr(emp_name, ' ') + 1) as last_name 
from input_table 
; 

EMP_ID EMP_NAME FIRST_NAME LAST_NAME 
---- ----------- ----------- ----------- 
0001 Jack Skelly Jack  Skelly  
0002 Susan Ryan Susan  Ryan