[英]select concat(first_name,' ',last_name) as "full name "from employees ---how to bring space when 2 columns are concatenated in oracle---
[英]How to split NAME into 3 different fields FIRST_NAME, MIDDLE_NAME & LAST_NAME when there is a space
如何將NAME分為3個不同的字段FIRST_NAME, MIDDLE_NAME & LAST_NAME
。
當前,NAME的格式為[FIRST_NAME || ' ' || MIDDLE_NAME|| ' ' ||LAST_NAME]
[FIRST_NAME || ' ' || MIDDLE_NAME|| ' ' ||LAST_NAME]
[FIRST_NAME || ' ' || MIDDLE_NAME|| ' ' ||LAST_NAME]
。 更清楚地說,假設一個人的名字是
FIRST_NAME: SHERRY
MIDDLE_NAME: L
LAST_NAME : CLEAVES
那么“ NAME”字段中有“ SHERRY L CLEAVES”,我想要在3個不同的字段中輸入。 另外,如果只有兩個名稱,該如何處理?
一些樣本數據如下:
('William Sears',
'PETER E LABBE',
'Edith Roberts',
'SHERRY L CLEAVES',
'Sharon Matthes',
'TAMMY L PELLETIER',
'STACIE M KINER',
'MICHAEL C THOMAS',
'CHESTER R DAVIS',
'MICHAEL D HUTCHINSON',
'Paul Mikkelsen'
)
這是一種實現方法:
with data_qry
as
(
select 'William Sears' as name from dual union all
select 'PETER E LABBE' as name from dual union all
select 'Edith Roberts' as name from dual union all
select 'SHERRY L CLEAVES' as name from dual union all
select 'Sharon Matthes' as name from dual union all
select 'TAMMY L PELLETIER' as name from dual union all
select 'STACIE M KINER' as name from dual union all
select 'MICHAEL C THOMAS' as name from dual union all
select 'CHESTER R DAVIS' as name from dual union all
select 'MICHAEL D HUTCHINSON' as name from dual union all
select 'Paul Mikkelsen' as name from dual
)
select name
, substr(name, 1, instr(name, ' ', 1)) as first
, case when instr(name, ' ', 1, 2) > 0 then substr(name, instr(name, ' ', 1, 1) + 1, instr(name, ' ', 1, 2) - instr(name, ' ', 1, 1) - 1) else null end as middle
, case when instr(name, ' ', 1, 2) > 0 then substr(name, instr(name, ' ', 1, 2) + 1) else substr(name, instr(name, ' ', 1, 1) + 1) end as last
from data_qry
輸出:
NAME FIRST MIDDLE LAST
William Sears William Sears
PETER E LABBE PETER E LABBE
Edith Roberts Edith Roberts
SHERRY L CLEAVES SHERRY L CLEAVES
Sharon Matthes Sharon Matthes
TAMMY L PELLETIER TAMMY L PELLETIER
STACIE M KINER STACIE M KINER
MICHAEL C THOMAS MICHAEL C THOMAS
CHESTER R DAVIS CHESTER R DAVIS
MICHAEL D HUTCHINSON MICHAEL D HUTCHINSON
Paul Mikkelsen Paul Mikkelsen
你可以做這樣的事情。 我考慮了一些可能性,例如名字和姓氏之間(無中間名字首字母)或名字和名字首字母之間,或名字和姓氏之間有任意數量的空格。 也是多字母縮寫。 仍然會有很多其他未曾預料到的問題,例如姓有兩個或兩個的人等等。
with input_strings ( str ) as (
select 'William Sears' from dual union all
select 'PETER E LABBE' from dual union all
select 'Edith Roberts' from dual union all
select 'SHERRY L CLEAVES' from dual union all
select 'Sharon Matthes' from dual union all
select 'TAMMY L PELLETIER' from dual union all
select 'STACIE M KINER' from dual union all
select 'MICHAEL C THOMAS' from dual union all
select 'CHESTER R DAVIS' from dual union all
select 'MICHAEL D HUTCHINSON' from dual union all
select 'Paul Mikkelsen' from dual
)
select initcap(substr(str, 1, instr(str, ' ') - 1)) as first_name,
upper(trim(substr(str, instr(str, ' '),
instr(str, ' ', -1) - instr(str, ' ')))) as mid_in,
initcap(substr(str, instr(str, ' ', -1) + 1)) as last_name
from input_strings;
FIRST_NAME MID_IN LAST_NAME
------------------------------ ------ ------------------------------
William Sears
Peter E Labbe
Edith Roberts
Sherry L Cleaves
Sharon Matthes
Tammy L Pelletier
Stacie M Kiner
Michael C Thomas
Chester R Davis
Michael D Hutchinson
Paul Mikkelsen
11 rows selected.
嘿,別忘了正則表達式! 假設您的名稱(對於名稱來說確實太簡單了)給定的名稱規范使用了分隔符,並且您沒有處理常見的名稱問題,那么這實際上只是解析一個分隔字符串,可以使用正則表達式執行以下操作:可以處理NULL列表元素(中間的首字母):
SQL> with tbl(name) as (
select 'William Sears' from dual union all
select 'PETER E LABBE' from dual union all
select 'Edith Roberts' from dual union all
select 'SHERRY L CLEAVES' from dual union all
select 'Sharon Matthes' from dual union all
select 'TAMMY L PELLETIER' from dual union all
select 'STACIE M KINER' from dual union all
select 'MICHAEL C THOMAS' from dual union all
select 'CHESTER R DAVIS' from dual union all
select 'MICHAEL D HUTCHINSON' from dual union all
select 'Paul Mikkelsen' from dual
)
select regexp_substr(name, '(.*?)( |$)', 1, 1, NULL, 1) first_name,
regexp_substr(name, '(.*?)( |$)', 1, 2, NULL, 1) mid_init,
regexp_substr(name, '(.*?)( |$)', 1, 3, NULL, 1) last_name
from tbl;
FIRST_NAME MID_INIT LAST_NAME
-------------------- -------------------- --------------------
William Sears
PETER E LABBE
Edith Roberts
SHERRY L CLEAVES
Sharon Matthes
TAMMY L PELLETIER
STACIE M KINER
MICHAEL C THOMAS
CHESTER R DAVIS
MICHAEL D HUTCHINSON
Paul Mikkelsen
11 rows selected.
SQL>
是的,已經被說了一百萬遍了,但是我會為您省去麻煩:substr()/ instr()更快,但是我發現嵌套的substr()/ instr()語法比令人討厭的regex語法更可怕。 我可能是少數。 不管怎樣,烈焰都消失了,你知道自己無能為力! :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.