SQL-Abfrage (Reihenfolge nach)

stimmen
1

Ich möchte Liste (eine sortierte Liste) alle meine Einträge aus einem Attribut namens Straßennamen in meinem Tisch / Beziehung Kunden. z.B. Ich möchte folgendes erreichen:

Street_1A
Street_1B
Street_2A
Street_2B
Street_12A
Street_12B

Ein einfacher Auftrag von Straßennamen wird einen lexikalischen Vergleich zu tun und dann Street_12A und B kommt vor Street_2A / B, und das ist nicht korrekt. Ist es möglich, dies durch reine SQL zu lösen?

Veröffentlicht am 09/12/2008 um 16:05
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
2

Für das Protokoll: heißt es natürliche Sortierung , und es gibt einen Coding Horror Artikel in diesem Thema.

Ich denke, man kann es in SQL tun einige der Code unter Verwendung zeigte hier, aber es wird von immer in einem Fall von Case-Szenario.

Beantwortet am 09/12/2008 um 17:11
quelle vom benutzer

stimmen
2

Wählen STREET_NAME aus Tablex Auftrag von udf_getStreetNumber (STREET_NAME)

in Ihrem udf_getStreetNumber - Ihr Unternehmen Regel die Nummer für Strippen schreiben

BEARBEITEN

Ich glaube, Sie jetzt Regex-Funktionalität in SQL Server verwenden können. Ich würde nur aus Streifen alle nicht-Anzahl Zeichen aus der Eingabe.

Beantwortet am 09/12/2008 um 16:10
quelle vom benutzer

stimmen
1

Wenn Sie Schreibzugriff auf die Datenbank haben würde ich wirklich empfehlen Umwandlung es alle drei separate Felder zu verwenden und sie dann in geeigneter Weise verwendet wird. Auf diese Weise können sie sogar in PHP tun konnte (ja, wird es einige Zeit dauern, aber es wird nur einmal geschehen). Dies könnte einig Schmerzen, wenn Sie eine große Code-Basis haben, für alle Abfragen mit dieser Tabelle zu überprüfen haben, aber es wird schließlich später Pay-off. Zum Beispiel wird es die Suche nach Adressen viel einfacher.

Beantwortet am 09/12/2008 um 16:27
quelle vom benutzer

stimmen
1

Ich bin sicher, Sie könnten durch die Straßen Feld Aufspaltung in sie verschiedene Stücke mit etwas sind wie substr (Strasse-, 1, finden (““ Strasse-)) nur für die Straße und so weiter. Aber das ist ziemlich chaotisch sein wird, und es wird mit allen Arten von Sonderfällen zu tun hat (ohne Hausnummer, Hausnummer ohne Zusatz) oder internationale Fragen (in den USA, Adressen sind in der Regel mögen 1 Street).

Aber wenn Sie die Sortierung wollen, wie Sie beschrieben, und das ist eine wichtige Voraussetzung, wäre es besser, Sie Strasse- in drei Teile zu modellieren, dh Straße (zB „Street“), HOUSE_NUMBER (zB 1, 2, 12), house_num_addition ( zB "A", "B"). Dann wird die Art trivial in SQL.

Beantwortet am 09/12/2008 um 16:15
quelle vom benutzer

stimmen
-1

Wenn es der Fall, dass alle Werte in der Spalte der Straßennamen Muster StreetName- Raum folgen - Hausnummer

wo Street können andere Leerzeichen enthalten, aber Hausnummer nicht können, dann wird diese Arbeit:

Declare @T Table (streetName VarChar(50))
Insert @T(streetName) Values('Street 1A')
Insert @T(streetName) Values('Street 2A')
Insert @T(streetName) Values('Street 2B')
Insert @T(streetName) Values('Street 12A')
Insert @T(streetName) Values('Another Street 1A')
Insert @T(streetName) Values('Another Street 4A')
Insert @T(streetName) Values('a third Street 12B')
Insert @T(streetName) Values('a third Street 1C')

Select * From @T 
Order By Substring(StreetName, 0, 1 + len(StreetName) - charIndex(' ', reverse(StreetName))),
       Cast(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)),  
        Case When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 5)) = 1  Then 5
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 4)) = 1  Then 4
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 3)) = 1  Then 3
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 2)) = 1  Then 2
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 1)) = 1  Then 1
                End) as Integer),
        Substring(StreetName, len(StreetName) - charIndex(' ', reverse(StreetName)) +
            Case When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 5)) = 1  Then 5
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 4)) = 1  Then 6
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 3)) = 1  Then 5
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 2)) = 1  Then 4
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 1)) = 1  Then 3
                End, Len(StreetName))
Beantwortet am 09/12/2008 um 16:35
quelle vom benutzer

stimmen
-1

Ja es ist möglich! Aber auf jeden Fall nicht von Interesse! Wenn Sie jemand hier fertig ein paar Stunden zu verbringen aufzuschreiben und die Prüfung die SP, die Ihre Straßennamen in eine St. + Hausnummer Kombination aufgeteilt werden, geben Sie mir seinen Namen: ich ihm ein paar Probleme unterbreiten, zu denen ich dachte, dass ich zu zahlen hatte zu bekommen Die Arbeit erledigt.

By the way, kann nicht geteilt Sie Ihre Daten in zwei Felder, ein ‚Strasse-‘ nur mit dem Namen der Straße, und ein neues ‚buildingNumber‘ Feld? (Vermeiden Sie, dies zu nennen ‚Hausnummer‘, wie in einigen Ländern / Städten, Straßen Zahlen angegeben).

Beantwortet am 09/12/2008 um 16:13
quelle vom benutzer

stimmen
-2

Der zuverlässigste Weg, es (zuverlässig im Sinne von „Ihre Daten zu sortieren richtig“, nicht „Ihr generelles Problem zu lösen“) zu tun ist, um die Daten in Straßennamen und Hausnummer zu spalten und sie beide auf ihrem eigenen sortieren. Dies erfordert jedoch zu wissen, wo die Hausnummer beginnt. Und das ist der schwierige Teil - unter der Annahme, Ihre Daten am besten paßt.

Sie sollten so etwas wie die folgenden verwenden, um Ihre Daten zu Refactoring und von jetzt an Speicher, um die Hausnummer in einem separaten Feld. All diese Zeichenfolge-Jonglieren nicht allzu gut, wenn es darum geht, große Datenmengen zu sortieren.

Unter der Annahme, es ist das letzte, was in den Straßennamen, und es enthält eine Reihe:

DECLARE @test TABLE
(
  street VARCHAR(100)
)

INSERT IGNORE  INTO @test (street) VALUES('Street')
INSERT IGNORE  INTO @test (street) VALUES('Street 1A')
INSERT IGNORE  INTO @test (street) VALUES('Street1 12B')
INSERT IGNORE  INTO @test (street) VALUES('Street 22A')
INSERT IGNORE  INTO @test (street) VALUES('Street1 200B-8a')
INSERT IGNORE  INTO @test (street) VALUES('')
INSERT IGNORE  INTO @test (street) VALUES(NULL)

SELECT
  street,
  CASE 
    WHEN LEN(street) > 0 AND CHARINDEX(' ', REVERSE(street)) > 0
    THEN CASE
      WHEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1) LIKE '%[0-9]%'
      THEN LEFT(street, LEN(street) - CHARINDEX(' ', REVERSE(street)))
    END
  END street_part,
  CASE 
    WHEN LEN(street) > 0 AND CHARINDEX(' ', REVERSE(street)) > 0
    THEN CASE 
      WHEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1) LIKE '%[0-9]%'
      THEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1)
    END
  END house_part,
  CASE 
    WHEN LEN(street) > 0 AND CHARINDEX(' ', REVERSE(street)) > 0
    THEN CASE 
      WHEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1) LIKE '%[0-9]%'
      THEN CASE
        WHEN PATINDEX('%[a-z]%', LOWER(RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1))) > 0
        THEN CONVERT(INT, LEFT(RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1), PATINDEX('%[^0-9]%', LOWER(RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1))) - 1))
      END
    END
  END house_part_num
FROM
  @test 
ORDER BY
  street_part,
  house_part_num,
  house_part

Dies setzt voraus, diese Bedingungen:

  • eine Adresse kann eine Hausnummer haben
  • eine Hausnummer muss das letzte , was in einer Straßenadresse (keine „525 Monroe Av.“)
  • eine Hausnummer sollte korrekt mit einer Ziffer beginnen sortiert
  • eine Hausnummer kann ein Bereich ( „200-205“) sein, würde dies unter 200 sortiert werden
  • eine Hausnummer darf nicht Leerzeichen oder Anerkennung versagt (Wenn Sie auf Ihre Daten sehen, könnten Sie etwas wie anwenden REPLACE(street, ' - ', '-')vorher gemeinsame Muster zu sanieren.)
  • das Ganze ist immer noch eine Annäherung, die von sicherlich abweicht, was es wie in einem Telefonbuch aussehen würde, zum Beispiel
Beantwortet am 09/12/2008 um 16:29
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more