site - sort data sql



Type complexe de champ "chaîne-nombre-chaîne" (2)

Fondamentalement, j'essaie de trier une table par son nom. La table est relativement grande, mais je ne poste qu'une colonne, par exemple. La colonne est la station ci-dessous

Station
===
ANTIL WELL 1
ANTIL WELL 2
BASELINE & CALIFORNIA WELL
EPA WELL 6
EPA WELL 7
EPA WELL 108
EPA WELL 109
EPA WELL 110
EPA WELL 111
EPA WELL 112
EPA WELL 108S

Le genre ci-dessus a été atteint en essayant ceci:

order by left(station,LEN(station) -PATINDEX('%[^0-9]%',REVERSE(station))+1)
,CONVERT(int,REVERSE(LEFT(REVERSE(station), PATINDEX('%[^0-9]%',REVERSE(station)) - 1)))

Cependant, je ne peux pas trier ce EPA WELL 108S. J'en ai besoin pour aller entre EPA WELL 108 et EPA WELL 109, j'ai essayé de nombreuses façons différentes.

La liste des stations continue également après EPA.


J'en ai besoin pour aller entre EPA WELL 108 et EPA WELL 109

Ensuite, vous ne trier pas par nom; vous le triez par des sous-composants distincts qui sont également incorporés dans la colonne de nom, mais dans une séquence différente. Vous devez créer des colonnes pour chaque sous-composant et trier les sous-composants:

Name            sc1         sc2    sc3
EPA WELL 108    EPA WELL    108
EPA WELL 6      EPA WELL      6
EPA WELL 7      EPA WELL      7
EPA WELL 109    EPA WELL    109
EPA WELL 108s   EPA WELL    108      s

Ensuite, vous pouvez utiliser une clause ORDER BY comme:

ORDER BY sc1, sc2, sc3

Si vous souhaitez éviter la duplication des données, supprimez la colonne Nom et assemblez votre nom d'affichage à partir des sous-composants:

SELECT sc1 + ' ' + Convert(VarChar, sc2) + sc3 AS Name

Il est rapide et facile de donner un nom à l'exécution. Il n'est ni rapide ni facile de trier les sous-composants de taille variable d'un VarChar à l'exécution.


Cette solution est plus fiable que la réponse choisie. Cette réponse peut ne pas donner la réponse attendue s'il y a plus de 1 nombre comme "EPA WELL 5 7" dans la station. Cette solution rembourse le nombre avec '0' de sorte que la comparaison considérera tous les nombres 8 chiffres.

DECLARE  @Table1 table([station] varchar(26))

INSERT INTO @Table1
    ([station])
VALUES
    ('ANTIL WELL 2'),
    ('ANTIL WELL 1'),
    ('BASELINE & CALIFORNIA WELL'),
    ('EPA WELL 7'),
    ('EPA WELL 6'),
    ('EPA WELL 108'),
    ('EPA WELL 109'),
    ('EPA WELL 110'),
    ('EPA WELL 111'),
    ('EPA WELL 112'),
    ('EPA WELL 108S'),
    ('EPA WELL 111108')
;

SELECT station
FROM @table1
ORDER BY 
CASE WHEN station not like '%[0-9]%' THEN station ELSE
   STUFF(station, PATINDEX('%[0-9]%',station), 0, replicate('0', 
   PATINDEX('%[0-9]%',station) - len(station) + PATINDEX('%[0-9]%',reverse(station)) + 6))
END

* La réponse de GoatCD ne donnera pas l'ordre correct dans mes données de test.





natural-sort