Dans PostgreSQL, vous pouvez utiliser le to_number()
fonction pour convertir une chaîne en une valeur numérique.
Plus précisément, il convertit la représentation sous forme de chaîne d'un nombre en une valeur numérique.
Par exemple, si vous avez $1,234.50
en tant que chaîne, vous pouvez utiliser to_number()
pour convertir cela en un nombre réel qui utilise le numérique type de données.
Syntaxe
La syntaxe ressemble à ceci :
to_number(text, text)
Où le premier argument est une représentation sous forme de chaîne du nombre et le deuxième argument définit le modèle utilisé par le premier argument.
Exemple
Voici un exemple de base pour illustrer.
SELECT to_number('80', '99');
Résultat :
80
Dans ce cas, j'ai utilisé 99
comme modèle. Chaque 9
est appelé « modèle de modèle ». Le 9
modèle de modèle représente une position de chiffre. J'en ai utilisé deux, car je voulais que les deux chiffres soient inclus.
Voici ce qui se passe si je supprime l'un des 9
s.
SELECT to_number('80', '9');
Résultat :
8
Il est donc important d'inclure le nombre correct de modèles de modèle dans le modèle.
Séparateur de groupe et point décimal
Lorsque vous travaillez avec des nombres plus grands et/ou des nombres avec des fractions de seconde, vous devrez inclure des modèles de modèle qui spécifient le séparateur de groupe et/ou le point décimal.
Vous pouvez le faire de deux manières.
La première option consiste à taper littéralement la virgule et le point décimal.
SELECT to_number('7,000.25', '9,999.99');
Résultat :
7000.25
La deuxième option consiste à utiliser les versions compatibles avec les paramètres régionaux. Ce sont G pour le séparateur de groupe (séparateur de milliers) et D pour le point décimal.
Ainsi, l'exemple précédent pourrait être réécrit comme suit :
SELECT to_number('7,000.25', '9G999D99');
Résultat :
7000.25
Symbole monétaire
Le L
le modèle de modèle représente un symbole monétaire compatible avec les paramètres régionaux.
SELECT to_number('$7,000.25', 'L9G999D99');
Résultat :
7000.25
Type de retour
La valeur de retour de to_number()
fonction est numérique.
Vous pouvez vérifier le type de retour avec le pg_typeof()
fonction.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Résultat :
numeric
Des résultats inattendus ?
Il est important de bien choisir le modèle. Sinon, vous pourriez vous retrouver avec des résultats inattendus.
Voici un exemple de ce qui se passe si j'oublie simplement d'inclure le L
modèle de modèle de l'exemple précédent.
SELECT to_number('$7,000.25', '9G999D99');
Résultat :
7000
Donc parce que j'ai oublié d'inclure le L
modèle de modèle (pour la devise), cela a désynchronisé l'ensemble du modèle avec le nombre, ce qui a entraîné le G
étant ignoré, ainsi que le D
.
Juste pour être clair, le voici à nouveau par rapport au bon modèle.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Résultat :
Right | Wrong ---------+------- 7000.25 | 7000
to_number() contre cast()
Le to_number()
La fonction est fournie principalement pour gérer les formats d'entrée qui ne peuvent pas être convertis par simple transtypage. Il est donc généralement inutile pour les représentations numériques standard.
Ainsi, le premier exemple sur cette page aurait pu être fait en utilisant cast()
.
SELECT cast('80' AS NUMERIC);
Résultat :
80
Mais nous commençons à rencontrer des problèmes lorsque les choses deviennent un peu plus complexes.
SELECT cast('$7,000.25' AS NUMERIC);
Résultat :
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Donc to_number()
a été principalement conçu pour des situations comme celle-ci.
Liste complète des modèles de modèles et des modificateurs
Postgres inclut beaucoup plus de modèles de modèles et de modificateurs.
Ceux-ci peuvent également être utilisés lors du formatage de valeurs numériques (par exemple lors de l'utilisation de to_char()
pour renvoyer une représentation sous forme de chaîne formatée du nombre).
Voir Modèles de modèles et modificateurs pour le formatage numérique dans PostgreSQL pour une liste complète.