2016-08-19 32 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))