Afin varchar chaîne numérique
Est-il possible de commander des lignes de résultat par un varchar
colonne en fonte à integer
dans Postgres 8.3?
Vous devez vous connecter pour publier un commentaire.
Est-il possible de commander des lignes de résultat par un varchar
colonne en fonte à integer
dans Postgres 8.3?
Vous devez vous connecter pour publier un commentaire.
Il est tout à fait possible.
Assurez-vous d'avoir valide les littéraux entiers dans votre
varchar
colonne ou vous obtenez une exception. (Attaque et de fuite des blancs de l'espace est ok - il être coupé automatiquement.)Si c'est le cas, alors pourquoi ne pas convertir la colonne de
integer
pour commencer? Plus petit, plus rapide, plus propre, plus simple.Comment éviter les exceptions?
Pour éliminer les chiffres avant la distribution, et ainsi éviter de possibles exceptions:
La
regexp_replace()
expression élimine efficacement tous les chiffres, de sorte que seuls les chiffres restent ou une chaîne vide. (Voir ci-dessous).\D
est une abréviation de la classe de caractères[^[:digit:]]
, ce qui signifie que tous les non-chiffres ([^0-9]
).Dans le vieux Postgres versions avec l'ancienne configuration
standard_conforming_strings = off
, vous devez utiliser Posix échapper à la syntaxe de la chaîne deE'\\D'
pour échapper à la barre oblique inverse\
. C'était par défaut dans Postgres 8.3, de sorte que vous aurez besoin pour votre version obsolète.Le 4e paramètre
g
est pour "globalement", demandant de remplacer tous occurrences, pas seulement la première.Vous peut souhaitez autoriser l'un des principaux dash (
-
) pour les nombres négatifs.Si la chaîne n'a pas de chiffres du tout, le résultat est une chaîne vide qui n'est pas valide pour une fonte à
integer
. Convertir des chaînes vides àNULL
avecNULLIF
. (Vous pourriez envisager de0
à la place.)Le résultat est garanti pour être valide. Cette procédure est une fonte à
integer
comme demandé dans le corps de la question, pas pournumeric
comme le titre le mentionne.Comment le faire rapidement?
Une façon est d'une index sur une expression. (Lien vers le manuel de la version 8.3.)
Ensuite utiliser la même expression dans le
ORDER BY
clause:Test avec
EXPLAIN ANALYZE
si l'index fonctionnel est utilisé.Également dans le cas où vous souhaitez commander par une colonne de texte qui a quelque chose convertibles à flotter, puis ce n':