SQL ερώτημα (αύξων από)

ψήφοι
1

Θέλω να προσθέσω (μια ταξινομημένη λίστα) όλες τις καταχωρήσεις μου από ένα χαρακτηριστικό που ονομάζεται Οδών στον πίνακα / σχέση με τους πελάτες μου. π.χ. Θέλω να επιτύχουν την ακόλουθη σειρά:

Street_1A
Street_1B
Street_2A
Street_2B
Street_12A
Street_12B

Μια απλή σειρά από Οδών θα κάνει μια λεξιλογική σύγκρισης και, στη συνέχεια, Street_12A και Β θα έρθει πριν από Street_2A / Β, και αυτό δεν είναι σωστό. Είναι δυνατόν να λυθεί αυτό με καθαρό SQL;

Δημοσιεύθηκε 09/12/2008 στις 16:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
2

Για την ιστορία: αυτό ονομάζεται Φυσικό Ταξινόμησης , και υπάρχει μια Κωδικοποίηση του άρθρου τρόμου για το θέμα.

Υποθέτω ότι μπορείτε να το κάνετε σε SQL χρησιμοποιώντας μερικές από τις κώδικα έδειξε εδώ, αλλά θα με πάντα σε κάθε περίπτωση σενάριο.

Απαντήθηκε 09/12/2008 στις 17:11
πηγή χρήστη

ψήφοι
2

Επιλέξτε STREET_NAME από tablex σειρά από udf_getStreetNumber (STREET_NAME)

στο udf_getStreetNumber σας - γράψτε κανόνας της επιχείρησής σας για την αφαίρεση από τον αριθμό

ΕΠΕΞΕΡΓΑΣΙΑ

Νομίζω ότι μπορείτε να χρησιμοποιήσετε το regex λειτουργικότητα του SQL Server τώρα. Είχα μόλις αφαιρέσει όλες τις μη-αριθμό χαρακτήρων από την είσοδο.

Απαντήθηκε 09/12/2008 στις 16:10
πηγή χρήστη

ψήφοι
1

Αν έχετε εγγραφής πρόσβαση στη βάση δεδομένων θα ήθελα να συστήσω πραγματικά μετατρέποντας όλα για να χρησιμοποιήσετε 3 διαφορετικά πεδία και στη συνέχεια, χρησιμοποιώντας τα κατάλληλα. Με αυτό τον τρόπο θα μπορούσε να το κάνει ακόμα και σε PHP (ναι, αυτό θα πάρει κάποιο χρόνο, αλλά αυτό θα συμβεί μόνο μία φορά). Αυτό θα μπορούσε να είναι κάποιο πόνο, αν έχετε ένα μεγάλο κώδικα βάσης, χρειάζεται να ελέγξετε για όλα τα ερωτήματα με αυτόν τον πίνακα, αλλά τελικά θα πληρώσει-off αργότερα. Για παράδειγμα, θα κάνει η αναζήτηση με βάση τη διεύθυνση πολύ πιο εύκολο.

Απαντήθηκε 09/12/2008 στις 16:27
πηγή χρήστη

ψήφοι
1

Είμαι βέβαιος ότι θα μπορούσατε να με διάσπαση το πεδίο streetname σε αυτό είναι διάφορα κομμάτια με κάτι σαν substr (streetname, 1, βρείτε (»», streetname)) μόνο για το δρόμο και ούτω καθεξής. Αλλά αυτό πρόκειται να είναι πολύ βρώμικο και θα πρέπει να ασχοληθεί με όλα τα είδη των ειδικών περιπτώσεων (χωρίς τον αριθμό του σπιτιού, τον αριθμό του σπιτιού χωρίς προσθήκη) ή διεθνή ζητήματα (στις ΗΠΑ, διευθύνσεις είναι συνήθως αρέσει 1 Οδός).

Αλλά αν θέλετε να τη διαλογή όπως περιγράψατε και αυτό είναι μια σημαντική προϋπόθεση, θα ήταν καλύτερα να σας μοντέλο streetname σε τρία μέρη, δηλαδή του δρόμου (π.χ. «Street»), house_number (π.χ. 1, 2, 12), house_num_addition ( π.χ. «Α», «Β»). Στη συνέχεια, το είδος γίνεται ασήμαντο σε SQL.

Απαντήθηκε 09/12/2008 στις 16:15
πηγή χρήστη

ψήφοι
-1

Αν είναι αλήθεια ότι όλες οι τιμές στη στήλη Οδών ακολουθούν χώρο του μοτίβο StreetName- - StreetNumber

όπου streetname μπορεί να περιέχει άλλους χώρους, αλλά StreetNumber ΔΕΝ ΜΠΟΡΕΙ, τότε αυτό θα λειτουργήσει:

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))
Απαντήθηκε 09/12/2008 στις 16:35
πηγή χρήστη

ψήφοι
-1

Ναι είναι δυνατόν! Αλλά σίγουρα δεν παρουσιάζουν ενδιαφέρον! Αν βρείτε κάποιον εδώ έτοιμοι να περάσουν μερικές ώρες να γράψει κάτω και τον έλεγχο της SP που θα χωρίσει Οδών σας σε συνδυασμό streetname + streetNumber, να μου δώσει το όνομά του: Εγώ θα τον υποβάλει κάποια προβλήματα όταν σκέφτηκα ότι έπρεπε να πληρώσει για να πάρει το έργο που επιτέλεσε.

Με την ευκαιρία, δεν μπορεί να σας χωρίσει τα δεδομένα σας σε 2 τομείς, μια «streetname» μόνο με το όνομα της οδού, και ένα νέο πεδίο «buildingNumber»; (Αποφύγετε να αναφέρουμε αυτό μια «streetNumber», όπως, σε ορισμένες χώρες / πόλεις, οι δρόμοι δίνονται αριθμοί).

Απαντήθηκε 09/12/2008 στις 16:13
πηγή χρήστη

ψήφοι
-2

Ο αξιόπιστος τρόπος για να το κάνουμε (αξιόπιστη από την άποψη της «για να ταξινομήσετε τα στοιχεία σας σωστά», όχι «να λύσει γενική πρόβλημά σας») είναι να χωρίσει τα δεδομένα σε οδός και αριθμός οικίας και να ταξινομήσετε τα δύο από αυτά από μόνα τους. Αλλά αυτό απαιτεί να γνωρίζει πού αρχίζει ο αριθμός σπιτιού. Και αυτό είναι το δύσκολο μέρος - καθιστώντας την υπόθεση ταιριάζει καλύτερα τα δεδομένα σας.

Θα πρέπει να χρησιμοποιήσετε κάτι σαν το παρακάτω, για να refactor τα στοιχεία σας και από τώρα και στο κατάστημα του αριθμού σπίτι σε ένα ξεχωριστό πεδίο. Όλη αυτή η κλωστή-juggling δεν θα εκτελέσει πολύ καλά όταν πρόκειται για την ταξινόμηση μεγάλων συνόλων δεδομένων.

Αν υποθέσουμε ότι είναι το τελευταίο πράγμα στο όνομα του δρόμου, και περιέχει έναν αριθμό:

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

Αυτό προϋποθέτει αυτούς τους όρους:

  • είναι μια διεύθυνση οδού μπορεί να έχει τον αριθμό του σπιτιού
  • ένας αριθμός οικίας πρέπει να είναι το τελευταίο πράγμα σε μια διεύθυνση οδού (όχι «525 Monroe Av.»)
  • ένας αριθμός σπίτι θα πρέπει να ξεκινά με ψηφίο πρέπει να διευθετηθεί σωστά
  • ένας αριθμός οικίας μπορεί να είναι μια σειρά ( «200-205»), αυτό θα πρέπει να ταξινομούνται κάτω από 200
  • ένας αριθμός σπίτι δεν πρέπει να περιέχει κενά ή την αναγνώριση αποτύχει (Αν κοιτάξει κανείς τα δεδομένα σας, θα μπορούσατε να εφαρμόσετε κάτι που ήθελα REPLACE(street, ' - ', '-')να απολυμάνετε κοινά πρότυπα των προτέρων.)
  • το όλο θέμα εξακολουθεί να είναι μια προσέγγιση που αποκλίνει σίγουρα από ό, τι θα μοιάζει σε ένα τηλεφωνικό κατάλογο, για παράδειγμα,
Απαντήθηκε 09/12/2008 στις 16:29
πηγή χρήστη

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