2010-12-10 2 views
2

В принципе, я имею дело с ужасно настроенной таблицей, которую я бы хотел перестроить, но я не уверен, что смогу на этом этапе.SQL: выберите выделение, основанное на регулярном выражении

Итак, таблица имеет адреса, и у нее есть тонна похожих записей для одного и того же адреса. Но иногда есть небольшие отклонения в адресе (т. Е. Комната № прикрепляется к В ОДНОМ КОЛОНКЕ, тьфу).

Как это:

ид | place_name | place_street

1 | Имя места One | 1001 Mercury Blvd
2 | Место Имя Два | 2388 Юпитер-стрит
3 | Имя места One | 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, но многие из них, похоже, используют сценарии С или что-то в этом роде. Должен ли я писать функции регулярных выражений и сохранять их в 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

Конечно, вы имели в виду выбор отдельных, не так ли? ;) –

+0

Нет. :) Вам не нужно «отличное», потому что предложение «group by» делает то же самое, т. Е. Каждая строка в результирующем наборе будет уникальной комбинацией первых четырех символов place_name и place_street. – Matt

3

Используйте функцию SQL ВЛЕВО:

SELECT DISTINCT LEFT(place_name, 4) 
0

Я бы порекомендовал вам взглянуть на нечеткий поиск операций в SQL Server. Вы можете сопоставить результаты намного лучше, чем вы пытаетесь сделать. Просто Google SQL Server нечеткий поиск.

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