2016-09-29 6 views
0

J'ai une base de données avec des enregistrements dans varchar Je veux commander. À l'heure actuelle, j'utilise la requête suivante pour trier par nombre:Trier varchar avec des lettres et des chiffres - PostgreSQL

SELECT name 
FROM table 
ORDER BY 
NULLIF(regexp_replace(name, E'\\D', '', 'g'), '')::int 

records mixtes (chiffres + lettres) sont commandés correctement, mais les enregistrements avec seulement les lettres ne sont pas correctement triés:

Query Results: 
name: 
1st guy 
2nd guy 
3rd guy 
10th guy 
11th guy 
v guy 
a guy 
z guy 
c guy 

Bien que le résultat Je veux est:

Query Results: 
name: 
1st guy 
2nd guy 
3rd guy 
10th guy 
11th guy 
a guy 
c guy 
v guy 
z guy 

Pouvez-vous les gars m'aider?

Répondre

2

Les valeurs qui n'ont aucun nombre aboutissent toutes à une valeur NULL pour ORDER BY. L'ordre de ces lignes n'est pas défini car elles ont toutes la même "valeur" à trier. Vous devez ajouter la colonne name comme deuxième critère de tri. Vous devez également vous assurer que les valeurs NULL de la première expression sont triées à la fin:

ORDER BY NULLIF(regexp_replace(name, E'\\D', '', 'g'), '')::int NULLS LAST, name