Dans PostgreSQL, j'ai une table avec une colonne varchar. Les données sont censées être des nombres entiers et j'en ai besoin en type entier dans une requête. Certaines valeurs sont des chaînes vides. Le suivant:
SELECT myfield::integer FROM mytable
rendements ERROR: invalid input syntax for integer: ""
Comment puis-je interroger un casting et avoir 0 en cas d'erreur lors du casting dans postgres?
la source
E'\\d{1,5}$'
.{1,5}
limite de @ Bobort ci-dessus sur les chiffres est peut-être une bonne idée si vous êtes préoccupé par le dépassement de capacité, mais cela masquera des nombres plus grands, ce qui pourrait causer des problèmes si vous convertissez une table. Personnellement, je préfère avoir l'erreur de requête à l'avant et savoir que certains de mes "entiers" sont vicieux (vous pouvez également sélectionner avec leE'\\d{6,}$'
premier pour vous en assurer).Vous pouvez également créer votre propre fonction de conversion, dans laquelle vous pouvez utiliser des blocs d'exception:
Essai:
la source
INSERT
déclaration?J'avais le même type de besoin et j'ai trouvé que cela fonctionnait bien pour moi (postgres 8.4):
Quelques cas de test pour démontrer:
Si vous devez gérer la possibilité que le champ contienne du texte non numérique (tel que "100bad"), vous pouvez utiliser regexp_replace pour supprimer les caractères non numériques avant le cast.
Ensuite, les valeurs text / varchar comme "b3ad5" donneront également des nombres
Pour répondre à la préoccupation de Chris Cogdon avec la solution ne donnant pas 0 pour tous les cas, y compris un cas tel que «mauvais» (aucun caractère numérique du tout), j'ai fait cette déclaration ajustée:
Cela fonctionne de la même manière que les solutions les plus simples, sauf qu'il donnera 0 lorsque la valeur à convertir est uniquement des caractères non numériques, tels que "mauvais":
la source
C'est peut-être un peu un hack, mais cela a fait le travail dans notre cas:
Explication (testé sur Postgres 8.4):
L'expression mentionnée ci-dessus donne
NULL
des valeurs NULL dansmyfield
et0
pour des chaînes vides (ce comportement exact peut ou non correspondre à votre cas d'utilisation).Données de test:
La requête donnera le résultat suivant:
Alors que sélectionner uniquement
values::integer
entraînera un message d'erreur.J'espère que cela t'aides.
la source
SELECT CASE WHEN myfield="" THEN 0 ELSE myfield::integer END FROM mytable
Je n'ai jamais travaillé avec PostgreSQL mais j'ai vérifié dans le manuel la syntaxe correcte des instructions IF dans les requêtes SELECT.
la source
La réponse de @ Matthew est bonne. Mais cela peut être plus simple et plus rapide. Et la question demande de convertir des chaînes vides (
''
) en0
, mais pas une autre entrée «syntaxe d'entrée non valide» ou «hors plage»:Cela renvoie
0
pour une chaîne vide etNULL
pour toute autre entrée non valide.Il peut facilement être adapté à toute conversion de type de données .
La saisie d'un bloc d'exception est nettement plus coûteuse. Si les chaînes vides sont courantes, il est judicieux de détecter ce cas avant de déclencher une exception.
Si les chaînes vides sont très rares, il vaut la peine de déplacer le test vers la clause d'exception.
la source
Cette fonction retournera toujours
0
s'il n'y a pas de chiffres dans la chaîne d'entrée.SELECT parse_int('test12_3test');
reviendra
123
la source
J'ai trouvé le code suivant facile et fonctionnel. La réponse originale est ici https://www.postgresql.org/message-id/[email protected]
J'espère que ça aide
la source
SUBSTRING peut aider dans certains cas, vous pouvez limiter la taille de l'int.
la source
Si les données sont censées être des entiers et que vous n'avez besoin que de ces valeurs sous forme d'entiers, pourquoi ne pas parcourir tout le kilomètre et convertir la colonne en une colonne entière?
Ensuite, vous pouvez effectuer cette conversion de valeurs illégales en zéros une seule fois, au point du système où les données sont insérées dans la table.
Avec la conversion ci-dessus, vous obligez Postgres à convertir ces valeurs encore et encore pour chaque ligne de chaque requête pour cette table - cela peut sérieusement dégrader les performances si vous effectuez de nombreuses requêtes sur cette colonne de cette table.
la source
La fonction suivante fait
error_result
) pour les résultats non castables, par exempleabc
ou999999999999999999999999999999999999999999
null
commenull
bigints
sont comparéeslower_bound
à, par exemple, appliquer uniquement des valeurs positivesla source
J'ai aussi le même besoin mais cela fonctionne avec JPA 2.0 et Hibernate 5.0.2:
Fonctionne à merveille. Je pense que ça marche aussi avec LIKE.
la source
Cela devrait également faire le travail, mais cela concerne SQL et n'est pas spécifique à postgres.
la source