0

私は列を持っていて、次のクエリを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 桁の内線番号、および「これは特殊なケースです」のようなテキストしかありません。

これらの例外に対応するには、クエリをどのように変更すればよいですか? また、氏名列に単語が 1 つしかない場合、次のエラー メッセージが表示されます。

「無効な長さパラメーターが 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 に答える