如果原始字段看起来像 paul@yates 那么这个语法正确地挑选出姓氏
substring(surname,CHARINDEX('@',surname+'@')+1,LEN(name3))
但是,如果该字段是 paul@b@yates,则姓氏看起来像 @b@yates。我希望删除中间的字母,以便只选择姓氏。有任何想法吗?
如果原始字段看起来像 paul@yates 那么这个语法正确地挑选出姓氏
substring(surname,CHARINDEX('@',surname+'@')+1,LEN(name3))
但是,如果该字段是 paul@b@yates,则姓氏看起来像 @b@yates。我希望删除中间的字母,以便只选择姓氏。有任何想法吗?
你可以;
;with T(name) as (
select 'paul@yates' union
select 'paul@b@yates'
)
select
right(name, charindex('@', reverse(name) + '@') - 1)
from T
>>
yates
yates
您可以反转数组,将其拆分直到找到第一个“@”,然后取出该部分并再次反转它。
如果这是java,应该有一个array.reverse函数,否则你可能需要自己写。
你也可以把字符串切成碎片,直到没有 mor "@" 符号,然后取最后一部分(子字符串应该返回 "-1" 或其他东西),但我更喜欢我的第一个想法。
这是一个给你的例子
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