2016-08-19 95 views
0

我想先说这个问题here有点帮助,但我的问题有点不同。比较SQL Server中多种格式的电话号码

我有两个表。第一个有:

| AREACODE| PHONENUMBER | Company Name | 
=========================================== 
| 800 | 115-4454 | Sample Company | 
| 800 | 141-2254 | Sample Company2 | 
| 800 | 113-9857 | Sample Company3 | 

第二个表有:

|PHONENUMBER| 
============= 
|18001154454| 
| 7274313 | 

此格式第二个表使得它真的很难,我为有人在SQL不是很大,来匹配表项。

我的问题与链接的区别在于我无法以任何方式更改表格。

完整的要求是,当表1中的区号+电话号码与表2中的电话号码匹配时,我需要选择一个名为公司名称的列。

我考虑过一个解决方案,使用CASE WHEN来检查长度并进行复杂的子字符串修改,但我怀疑这是否是正确的方法。任何帮助,将不胜感激。如果我对任何事情都不清楚,请问,我会尽我所能为您澄清。

编辑

所有列都是字符串。

预计的成果将是电话号码,并在它的电话号码表间的任何匹配的公司名称是从第一台原始格式从上面的例子(区号+ PHONENUMBER)

所以我期望

PHONENUMBER | Company Name | 
=================================== 
    800-115-4454 | Sample Company | 
+0

可以请您展示一些预期的输出样本 – TheGameiswar

+1

这里是一个很好的开始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

哪些数据类型是列? –

回答

2

假设这些都是字符串列,你可以摆脱-REPLACE并结合单独的列与一列比较:

SELECT  CompanyName 
FROM  SingleColumnTable S 
INNER JOIN MultiColumnTable M on M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 

在那里是一个领先的一个情况:

INNER JOIN MultiColumnTable M 
    ON M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 
    OR '1' + M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 

在这种情况下,没有区码:

INNER JOIN MultiColumnTable M 
    ON M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 
    OR '1' + M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 
    OR REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 

完整的查询:

SELECT  M.AreaCode + '-' + M.PhoneNumber "PhoneNumber", M.CompanyName 
FROM  SingleColumnTable S 
INNER JOIN MultiColumnTable M 
    ON M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 
    OR '1' + M.AreaCode + REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 
    OR REPLACE(M.PhoneNumber,'-','') = S.PhoneNumber 

免责声明:可能会表现得像绝对垃圾,希望不是你需要反复使用的东西。

+0

这应该工作,假设所有地区代码在两个表中匹配。然而,根据这个问题,SingleColumnTable看起来可能有一个,或者可能根本没有区号。 –

+0

@JacobMorris是的,没有更多的样本数据,这很难说。我认为这是OP所希望的逻辑,但可能还有很多其他因素,例如区号前面的1或NULL,等等,这些都需要处理。 –

+0

问题是领先的1或地区代码丢失。我对最小数据表示歉意。认为它会给出一个想法。 – Resistance

0

试试这个脚本..我认为在比较字符串之前和之后都有可能出现空格。也需要在区域代码中期望空值。

SELECT * 
FROM SingleColumnTable S 
INNER JOIN MultiColumnTable M 
    ON LTRIM(RTRIM(ISNULL(M.AreaCode,''))) + LTRIM(RTRIM(REPLACE(M.PhoneNumber,'-',''))) = LTRIM(RTRIM(S.PhoneNumber))