-1

従業員情報を含むデータベースの保守が不十分です。人事部は、保険補償範囲に関連付けられた従業員の名前が保険証券の名前と一致しない事例をリストするレポートを要求しました。

両方の表の名前の形式に矛盾があります。常に姓の後に名が続きますが、Steven J. Smith という架空の従業員について、いずれかの表に次のいずれかが表示される場合があります。

  1. スミス、スティーブン
  2. スミス、スティーブン
  3. スミス、スティーブン J.
  4. スミス、スティーブン J.

EMPLOYEE.EMP_NAME <> INSURANCE.SUBSCRIBER_NAME のインスタンスを探すクエリを実行する必要がありますが、上記のように名前の形式の違いを考慮します (つまり、"Smith,Steven J." と "Smith, Steven" は (おそらく)同じ人であり、それらを無視しています)。

SELECT 
  EMPLOYEE.EMP_NO
, EMPLOYEE.EMP_NAME
, INSURANCE.SUBSCRIBER_NAME
, INSURANCE.PAYOR_NAME

FROM EMPLOYEE
     INNER JOIN INSURANCE ON EMPLOYEE.EMP_NO = INSURANCE.EMP_NO

WHERE EMPLOYEE.EMP_NAME <> INSURANCE.SUBSCRIBER_NAME

中間のイニシャルを無視する部分文字列を作成したいのはわかっていますが、カンマの後にスペースがあるかどうかを無視するにはどうすればよいでしょうか?

4

4 に答える 4

0

カンマの後のスペースを削除してから、イニシャルを削除できます

declare @Temp table (Name nvarchar(128))

insert into @Temp
select 'Smith, Steven' union all
select 'Smith,Steven' union all
select 'Smith, Steven J.' union all
select 'Smith,Steven J.'

select 
    case
        when N1.Name like '% %' then left(N1.Name, charindex(' ', N1.Name))
        else N1.Name
    end as Name_New,
    T.Name
from @Temp as T
    outer apply (select replace(T.Name, ', ', ',') as Name) as N1
于 2012-10-29T14:34:30.913 に答える
0

あなたは単にreplaceコンマを出すことができます

 WHERE replace (EMPLOYEE.EMP_NAME,',','') <> replace (INSURANCE.SUBSCRIBER_NAME,',','')

ほとんどの不一致を見つけるには...

;with cE as 
(select 
     EMP_NO, 
     REPLACE(REPLACE(REPLACE(EMP_NAME,',',''),' ',''),'.','') as namekey 
from EMPLOYEE),
ci as 
(select 
     EMP_NO, 
     REPLACE(REPLACE(REPLACE(SUBSCRIBER_NAME,',',''),' ',''),'.','') as namekey 
from INSURANCE)
select *
from ce
    inner join ci on ce.EMP_NO = ci.EMP_NO
where
     not
     (
    (LEN(ce.namekey)< LEN(ci.namekey) and ci.namekey like ce.namekey+'%')
        or
    (LEN(ce.namekey)>= LEN(ci.namekey) and ce.namekey like ci.namekey+'%')
     )
于 2012-10-29T14:00:19.800 に答える
0

ありがとう、あなたの答えは大いに役立ちました。名前を [lastname][firstname] にスペースを入れずに切り取り、中間のイニシャルがある場合は切り捨てました。同名の一致の大部分を排除するために最終的に機能したのは次のとおりです。

((CASE
WHEN CHARINDEX(' ',REPLACE(REPLACE(EMPLOYEE.EMP_NAME,', ',''),',','')) = 0
THEN UPPER(REPLACE(REPLACE(EMPLOYEE.EMP_NAME,', ',''),',',''))
ELSE UPPER(LEFT(REPLACE(REPLACE(EMPLOYEE.EMP_NAME,', ',''),',',''),CHARINDEX(' ',REPLACE(REPLACE(EMPLOYEE.EMP_NAME,', ',''),',',''))))
END) <> 
(CASE
WHEN CHARINDEX(' ',REPLACE(REPLACE(INSURANCE.SUBSCRIBER_NAME
,', ',''),',','')) = 0
THEN UPPER(REPLACE(REPLACE(INSURANCE.SUBSCRIBER_NAME
,', ',''),',',''))
ELSE UPPER(LEFT(REPLACE(REPLACE(INSURANCE.SUBSCRIBER_NAME
,', ',''),',',''),CHARINDEX(' ',REPLACE(REPLACE(INSURANCE.SUBSCRIBER_NAME
,', ',''),',',''))))
END))
于 2012-10-31T13:18:07.910 に答える
0

REPLACE ですべてのコンマとスペースを削除しないのはなぜですか?

WHERE REPLACE(REPLACE(EMPLOYEE.EMP_NAME,' ',''),',','') <> REPLACE(REPLACE(INSURANCE.SUBSCRIBER_NAME,' ',''),',','')
于 2012-10-29T14:10:46.140 に答える