我有FullName
列,我使用以下查询提取First Name
和last name
select SUBSTRING(FULL_NAME, 1, CHARINDEX(' ', FULL_NAME) - 1) AS FirstName,
SUBSTRING(FULL_NAME, CHARINDEX(' ', FULL_NAME) + 1, 500) AS LastName
from [dbo].[TABLE]
但是在Full Name
列中只有名字,大约10位数的电话号码,4位数的扩展名和一些文字,例如“这是一个特殊情况”。
如何修改查询以适应这些异常?而且当Full Name列中只有单个单词时,我收到以下错误消息:
“传递给LEFT或SUBSTRING函数的长度参数无效。”
答案 0 :(得分:0)
从自由形式字段中解析好名字并非易事......
我建议采用双重方法。
识别常见模式,即您可能会找到类似这样的电话号码
Where IsNumeric( Replace(Field,'-','')=1
您可以使用
标识单个名称Where charindex(' ',trim(field))=0
等
一旦你确定了它们,写代码就会试图将它们分开......
因此,您可以使用上面的代码和以下WHERE子句
select SUBSTRING(FULL_NAME, 1, CHARINDEX(' ', FULL_NAME) - 1) AS FirstName,
SUBSTRING(PRQ_BP_CONTACT_NAME, CHARINDEX(' ', FULL_NAME) + 1, 500)
AS LastN
from [dbo].[TABLE]
where charindex(' ',trim(field))>0 and Where IsNumeric( Replace(Field,'-','')=0
使用WHERE子句(a)确保只获得可以解析的记录,(b)帮助识别您需要做的奇怪案例手工......
祝你好运答案 1 :(得分:0)
你可以使用一个函数,它允许你在变换中放入你需要的任何逻辑,并使事情更具可读性:
create function dbo.namepart( @fullname varchar(50), @part varchar(5))
returns varchar(10)
as
begin
declare @first varchar(50)
declare @last varchar(50)
declare @sp int
if @fullname like '%special value%' return ''
if @fullname like '% %'
begin
set @sp = CHARINDEX(' ', @fullname)
set @first = left(@fullname, @sp - 1)
set @last = substring(@fullname,@sp + 1 ,50)
if isnumeric(@last) <> 0 set @last = ''
end
else
begin
set @first = @fullname
set @last = ''
end
if @part like 'f%'
return @first
else
return @last
return ''
end
示例数据
create table blah(
full_name varchar(50)
)
insert into blah values ( 'john smith' ), ('paul 12345'),('evan'),('special value')
看看它是否有效
select
dbo.namepart(full_name,'first') first,
dbo.namepart(full_name,'last') last,
full_name
from blah