考虑到oracle中的空格,hyphons,dot等,如何匹配来自不同表的字符串

时间:2014-12-05 11:55:49

标签: sql

我有两张表G1DM和S1DM。我想匹配G1DM和S1DM中的NAME列与最大匹配数。问题是初始的整个名称是针对S1DM给出的,但是在G1DM中,初始值在另一列中给出为ABBREVI。我应该通过考虑空格等来匹配两个表中的最大名称数。因为S1DM中的条目ARUNKUMAR A R在G1DM中作为ARUN KUMAR给出,其初始值在ABBREVI中给出。后来我需要匹配同时也有DOB的名字。请提供解决方案。

我正在使用Oracle。

TABLES:

1) S1DM

NAME

ABDUL RASHEED K

ARUN ALPHONSE

ARUN BHASKAR

ARUNKUMAR A R

CHANDRASEKHARAN P

DILEEPAN P

E B PRASAD

JEYAKUMAR K

JOE KURUVILLA EASOW

JOHN N V

LEKHA R

LILA KUMARY S

NISHA A K

NOUSAD M

PRASAD R

RADHAMONI A K

RAJEESH T

RAJESH M G

REJI V KURIAKOSE

RENI LUKOSE

RENJITH P

SASIDHARAN V M

SHAJAHAN A

SHIJU K K

SHINOI K R

SIDHAKUMAR V

SOMASUNDARAM P

SUJITH KUMAR J S

WILSON MATHEW T

DOB 30-05-79

81年5月11日

30-05-82

27-05-79

21-11-55

15-05-81

24-05-62

68年7月5日

15-02-62

20-05-63

29-05-59

58年1月6日

17-09-61

31-05-71

26-05-64

26-05-59

26-05-74

30-05-73

76年1月4日

17-03-81

16-03-80

27-09-59

59年12月5日

31-05-79

76年4月4日

25-05-78

21-05-59

20-04-80

60年2月1日

2)G1DM

命名

ABDUL RASHEED

ARUN ALPHONSE

ARUN BHASKAR

ARUN KUMAR

DANIEL DEVARAJ

迪利潘

JEYAKUMAR

JOE KURUVILLA EASOW

JOHN

NOUSAD

普拉萨德

普拉萨德

RADHAMONI

RAJEESH

RAJESH

REJI.V.KURIAKOSE

RENI LUKOSE

SASIDHARAN

萨蒂恩

SHAJAHAN

石咀

SIDHAKUMAR

SIVANANDAN

SOMASUNDARAM

SUJITH KUMAR

SUSHAMAKUMARI

WILSON MATHEW

ABBEVI

ķ

NULL

NULL

A.R

NULL

P

ķ

NULL

N.V

中号

E.B

[R

A.K

Ť

M.G

NULL

NULL

V.M。

P K

一个。

K.K。

ķ。

P上。

J.S。

S上。

吨。

DOB

30-05-79

81年5月11日

30-05-82

27-05-79

20-08-55

15-05-81

68年7月5日

15-02-62

20-05-63

31-05-71

24-05-62

26-05-64

26-05-59

26-05-74

30-05-73

76年1月4日

17-03-81

27-09-59

20-05-57

59年12月5日

31-05-79

25-05-78

57年9月12日

21-05-59

20-04-80

30-04-57

60年2月1日

我使用的查询是:

选择c.name,b.name来自S1DM c内部联接G1DM在c.name上像concat('%',b.name);

从S1DM c内连接G1DM b中选择c.name,b.name((c.name如concat(b.name,'%'))和c.dob = b.dob);

通过使用这些我得到了条目,但名称Prasad来了两次..而ARUNKUMAR也不匹配..请给我一个解决方案

1 个答案:

答案 0 :(得分:1)

与其他说明相反,这是相当简单的。由于您使用的是Oracle,因此可以使用TRIMREPLACE的组合来消除abbrevi列中的点。您的联接需要考虑两种情况 - 在您的某些数据中,首字母在名称之前,而在某些情况下,它们在名称之后。我建议使用IN来涵盖这两种情况。

如果没有将ARUNKUMAR与ARUN KUMAR相匹配,您的查询可以这样写。

SELECT c.name, b.name 
FROM   S1DM c JOIN G1DM b 
ON  c.name IN ( 
    TRIM( REPLACE(b.abbrevi, '.', ' ') || ' ' || b.name), 
    TRIM( b.name || ' ' || REPLACE(b.abbrevi, '.', ' ')))
AND c.dob = b.dob

要处理两个名称之间空格不匹配的情况,可以从两个名称中完全消除空格。那将是这样的。

SELECT c.name, b.name 
FROM   S1DM c JOIN G1DM b 
ON  REPLACE(c.name, ' ', '') IN ( 
    REPLACE(b.abbrevi, '.', '') || REPLACE(b.name, ' ', ''), 
    REPLACE(b.name, ' ', '') || REPLACE(b.abbrevi, '.', ''))
AND c.dob = b.dob