0

我有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 位数的分机号和一些文本,例如“这是一个特殊情况”。

我应该如何修改我的查询以适应这些异常?而且,当全名列中只有单个单词时,我收到以下错误消息:

“传递给 LEFT 或 SUBSTRING 函数的长度参数无效。”

4

2 回答 2

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)帮助识别您需要手动完成的奇怪案例......

祝你好运

于 2013-07-12T00:57:02.553 回答
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

于 2013-07-12T01:50:23.323 回答