如何解决Oracle SQL动态订阅
我有一列(USERNAME),其中包含客户端名称。我需要能够将其分为两列,即FNAME和LNAME。问题是有些人的枪管法力是两倍甚至三倍。 USERNAME列中的名称用空格分隔。例如,如下所示,姓氏以粗体突出显示
USERNAME
斯蒂芬·约翰史密斯
彼得琼斯
布莱恩·詹姆斯·安德鲁斯彭斯
我尝试使用regexp_substr,但这只是给我直到第一个空格为止的数据,因此只能使用名字
regexp_substr(USERNAME,'[^ ]+') AS FNAME
我还尝试使用SUBSTR和INSTR,可以得到前两个名字,也可以用于三个名字,但它不是动态的
substr(USERNAME,1,instr(USERNAME || ' ',' ',2,2) - 1) as FIRST_TWO_NAMES,
我的想法是,我需要从正确的位置开始工作,直到最后一个空格,这将为我提供姓氏。然后在另一个查询中再次使用此语句从原始列中提取名字,给我一个可以有多个空格的名字。还是有解决此问题的简便方法?
解决方法
如果您为instr
的第三个参数提供负值,则它将从字符串的末尾开始向后工作:
with rws as (
select 'Stephen John Smith' usr from dual union all
select 'Peter Jones' usr from dual union all
select 'Brian James Andrew Spence' usr from dual
)
select substr ( usr,1,instr ( usr,' ',-1 ) - 1 ) firstname,substr ( usr,-1 ) + 1 ) lastname
from rws;
FIRSTNAME LASTNAME
Stephen John Smith
Peter Jones
Brian James Andrew Spence
,
您可以在REGEXP_COUNT()
中使用REGEXP_SUSBTR()
函数来确定最后一个空格和提取的surname
的出现,然后在下一步中使用REPLACE()
提取name
列:
WITH t AS
(
SELECT REGEXP_SUBSTR( username,'[^ ]+',REGEXP_COUNT( username,'[^ ]+')) AS surname,username
FROM tab
)
SELECT REPLACE(username,surname) AS name,surname
FROM t
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。