2010-12-10 26 views
2

基本上,我正在處理一個可怕的設置表,我很想重建,但我不確定我能否在這一點上。SQL:根據正則表達式選擇不同

因此,該表是地址,並且它具有大量相同地址的相似條目。但是,地址有時會有輕微的變化(即,房間號被固定在同一列上,呃)。

像這樣:

ID | place_name | place_street

1 |地名1 | 1001 Mercury Blvd
2 |地名2 | 2388 Jupiter Street
3 |地名1 | 1001 Mercury Blvd,Suite A
4 |地名,一| | 1001 Mercury Boulevard
5 |放置Nam Two | 2388木星街,101室

我想這樣做是在SQL(這是MSSQL),如果可能的話,是做一個查詢是這樣的:

SELECT DISTINCT place_name, place_street where [the first 4 letters of the place_name are the same] && [the first 4 characters of the place_street are the same].

來,我猜到這一點,得到:
Plac | 1001
Plac | 2388

基本上,然後我可以計算出我有什麼主要地址打入另一個表來規範化,因爲其餘的只是輕微的派生。

我希望這是有道理的。

我已經做了一些研究,我發現人們在SQL中使用正則表達式,但是他們中的很多人似乎都在使用C腳本或其他東西。在執行任何正則表達式之前,我是否必須編寫正則表達式函數並將它們保存到SQL Server中?

關於我是否可以用SQL編寫它們,或者如果我有另一個步驟來完成,那麼任何方向都會很棒。

或者如何解決這個問題。

在此先感謝!

回答

1

我不認爲你需要的正則表達式來獲得您所描述的結果。你只是想調整列和組的結果,這將有效地給你不同的值。

SELECT left(place_name, 4), left(place_street, 4), count(*) 
FROM AddressTable 
GROUP BY left(place_name, 4), left(place_street, 4) 

count(*)列是沒有必要的,但它給你一些想法,其中值可能有共同的大多數(可能)地址重複的行。

+0

當然,你的意思是選擇不同的,對嗎? ;) – 2010-12-10 19:25:39

+0

沒有。 :)由於「group by」子句的作用相同,因此不需要「distinct」,即結果集中的每一行都將是place_name和place_street的前四個字符的唯一組合。 – Matt 2010-12-10 20:31:47

3

使用SQL函數LEFT:

SELECT DISTINCT LEFT(place_name, 4) 
0

我建議你看看SQL Server中的模糊搜索操作。你可以比你想要做的更好地匹配結果。只是谷歌SQL服務器模糊搜索。

0

至少SQL Server 2005的假設爲CTE

;with cteCommonAddresses as (
    select left(place_name, 4) as LeftName, left(place_street,4) as LeftStreet 
     from Address 
     group by left(place_name, 4), left(place_street,4) 
     having count(*) > 1 
) 
select a.id, a.place_name, a.place_street 
    from cteCommonAddresses c 
     inner join Address a 
      on c.LeftName = left(a.place_name,4) 
       and c.LeftStreet = left(a.place_street,4) 
    order by a.place_name, a.place_street, a.id