基本上,我正在处理一个我想要重建的可怕的桌子,但我不确定在这一点上。
因此,该表是地址,并且它具有相同地址的大量类似条目。但是地址有时会略有不同(例如,在同一列中添加了一个房间#,呃)。
像这样:
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中编写它们或者如果我还有其他步骤要做的任何方向都会很棒。
或者如何解决这个问题。
提前致谢!
答案 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