Sql server 名姓分离

Sql server 名姓分离,sql-server,Sql Server,如果原始字段看起来像paul@yates然后这个语法正确地识别出姓氏 substring(surname,CHARINDEX('@',surname+'@')+1,LEN(name3)) 但是,如果字段是paul@b@耶茨:那么姓氏看起来像@b@yates. 我想去掉中间的字母,这样它就只去掉姓氏了。 有什么想法吗?你可以反转数组,将其拆分,直到找到第一个“@”,取下该部分,然后再次反转 如果这是java,那么应该有一个array.reverse函数,否则您可能需要自己编写它 您也可以将字

如果原始字段看起来像paul@yates然后这个语法正确地识别出姓氏

  substring(surname,CHARINDEX('@',surname+'@')+1,LEN(name3))
但是,如果字段是paul@b@耶茨:那么姓氏看起来像@b@yates. 我想去掉中间的字母,这样它就只去掉姓氏了。
有什么想法吗?

你可以反转数组,将其拆分,直到找到第一个“@”,取下该部分,然后再次反转

如果这是java,那么应该有一个array.reverse函数,否则您可能需要自己编写它

您也可以将字符串切成碎片,直到没有mor“@”符号为止,然后取最后一部分(子字符串应返回“-1”或其他内容),但我更喜欢我的第一个想法。

您可以

;with T(name) as (
    select 'paul@yates' union
    select 'paul@b@yates'
)
select 
    right(name, charindex('@', reverse(name) + '@') - 1) 
from T

>>

yates
yates

这里有一个例子

declare @t table (name varchar(max));
insert @t select
'john' union all select
'john@t@bill' union all select
'joe@public';

select firstname=left(name,-1+charindex('@',name+'@')),
       surname=case when name like '%@%' then
         stuff(name,1,len(name)+1-charindex('@',reverse(name)+'@'),'')
         end
from @t;

-- results

FIRSTNAME   SURNAME
john    (null)
john    bill
joe public

请重新考虑将名称字段分开存储。您将如何处理姓氏中的空格?少女的名字?前缀?后缀?你的数据到底为什么充满了
@
s?而且,如果需要单独处理名称部分,为什么不将它们存储为单独的列?