无法从“全名”列中提取“姓”和“姓”

时间:2013-07-12 00:16:13

标签: sql sql-server-2012

我有FullName列,我使用以下查询提取First Namelast 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函数的长度参数无效。”

2 个答案:

答案 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

http://sqlfiddle.com/#!6/eb28f/2