2010-12-10 7 views
2

Grundsätzlich habe ich es mit einem schrecklich eingerichtet Tabelle, die ich gerne wieder aufbauen würde, aber ich bin mir nicht sicher, ob ich an dieser Stelle kann.SQL: Wählen Sie basierend auf regulären Ausdruck eindeutig

So ist die Tabelle der Adressen, und es hat eine Tonne von ähnlichen Einträgen für die gleiche Adresse. Aber es gibt manchmal geringfügige Abweichungen in der Adresse (d. H. Eine Raumnummer wird in IN GLEICHE SPALTE angeheftet).

So:

id | Ortsname | place_street

1 | Platziere einen Namen | 1001 Mercury Blvd
2 | Ortsname Zwei | 2388 Jupiter Street
3 | Platziere einen Namen | 1001 Mercury Blvd, Suite A
4 | Ortsname, Einer | 1001 Mercury Boulevard
5 | Place Nam Zwei | 2388 Jupiter Street, Rm 101

Was würde Ich mag es, in SQL tun (das ist MSSQL), wenn möglich, ist eine Abfrage tun, die wie ist:

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].

, ich Raten Sie an diesem Punkt, erhalten:
Plac | 1001
Plac | 2388

Grundsätzlich kann ich dann herausfinden, was die Hauptadressen sind, die ich in eine andere Tabelle ausbrechen muss, um das zu normalisieren, weil der Rest nur leichte Ableitungen sind.

Ich hoffe, dass das Sinn macht.

Ich habe einige Nachforschungen gemacht und ich sehe Leute, die reguläre Ausdrücke in SQL verwenden, aber viele von ihnen scheinen C-Skripte oder so zu verwenden. Muss ich Regex-Funktionen schreiben und sie vor dem Ausführen regulärer Ausdrücke in SQL Server speichern?

Irgendeine Richtung auf, ob ich sie gerade in SQL schreiben kann oder wenn ich einen anderen Schritt habe, um zu gehen, wäre groß.

Oder auf, wie man dieses Problem anspricht.

Vielen Dank im Voraus!

Antwort

1

Ich glaube nicht, Sie reguläre Ausdrücke müssen die Ergebnisse, die Sie beschreiben. Sie möchten nur die Spalten trimmen und nach den Ergebnissen gruppieren, wodurch Sie effektiv unterschiedliche Werte erhalten.

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

Die count(*) Spalte ist nicht notwendig, aber es gibt Ihnen eine Vorstellung davon, welche Werte könnten sich die (möglicherweise) haben Adresszeilen gemeinsam duplizieren.

+0

Natürlich meintest du auserlesen, klar? ;) –

+0

Nein. :) Sie brauchen "distinct" nicht, da die "group by" -Klausel das Gleiche tut, d. H. Jede Zeile in der Ergebnismenge ist eine eindeutige Kombination der ersten vier Zeichen von place_name und place_street. – Matt

3

die SQL-Funktion LEFT Verwendung:

SELECT DISTINCT LEFT(place_name, 4) 
0

Ich würde Sie in SQL Server suchen in Fuzzy-Suche Operationen empfehlen. Sie können die Ergebnisse viel besser als das, was Sie versuchen, abgleichen. Just google sql Server Fuzzy-Suche.

0

mindestens SQL Server Unter der Annahme, 2005 für die 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