SQL:根据正则表达式选择distinct

时间:2010-12-10 18:53:37

标签: sql sql-server regex

基本上,我正在处理一个我想要重建的可怕的桌子,但我不确定在这一点上。

因此,该表是地址,并且它具有相同地址的大量类似条目。但是地址有时会略有不同(例如,在同一列中添加了一个房间#,呃)。

像这样:

id | place_name | place_street

1 |地名一| 1001 Mercury Blvd
2 |地名二| 2388 Jupiter Street
3 |地名一| 1001 Mercury Blvd,Suite A
4 |地名,一个| 1001 Mercury Boulevard
5 |放置Nam Two | 2388 Jupiter Street,Rm 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中编写它们或者如果我还有其他步骤要做的任何方向都会很棒。

或者如何解决这个问题。

提前致谢!

4 个答案:

答案 0 :(得分:3)

使用SQL函数LEFT:

SELECT DISTINCT LEFT(place_name, 4)

答案 1 :(得分:1)

我认为您不需要正则表达式来获得您描述的结果。您只想根据结果修剪列和分组,这将有效地为您提供不同的值。

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

count(*)列不是必需的,但它可以让您了解哪些值可能具有最多(可能)重复的地址行。

答案 2 :(得分:0)

我建议你研究一下SQL Server中的模糊搜索操作。您可以比您尝试的更好地匹配结果。只需google sql server模糊搜索。

答案 3 :(得分:0)

至少假设CTE的SQL Server 2005:

;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