PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Erreur de syntaxe d'entrée non valide pour un entier pour un non entier ?

Votre entrée échoue avec une erreur de syntaxe dans constructeur ARRAY avant même d'arriver à résolution de type de fonction - où vous obtiendrez plus de messages d'erreur dus à d'autres incompatibilités de type une fois que vous aurez supprimé le constructeur ARRAY qui ne devrait pas du tout figurer dans l'appel.

Votre solution consiste à transmettre des paramètres séparés de type correspondant , pas un tableau. Le reste n'est qu'une explication de ce que nous avons vu.

Ce qui s'est vraiment passé

Un tableau ne peut inclure que des valeurs du même type, mais votre entrée mélange constantes numériques avec un littéral de chaîne non numérique , qui ne peut pas être résolu.

Si vous voulez qu'il se résolve en text[] (tableau de text ), vous devez fournir des littéraux de chaîne comme suit :

SELECT ARRAY['1004', '2', '1079412', 'WwLEA6XZ0'];

Ou un tableau littéral directement, comme ceci :

SELECT '{1004, 2, 1079412, WwLEA6XZ0}'::text[];

Mais une fois que vous démarrez un constructeur ARRAY avec des constantes numériques, seuls les types numériques sont autorisés à ajouter. Ou au moins des littéraux de chaîne avec un contenu qui peut être contraint au même type. Vous pourriez :

SELECT ARRAY[1004, 2, 1079412, '1'];

... résultant en int[] . Ou :

SELECT ARRAY[1004, 2, 1079412, 1.0];

Ou encore :

SELECT ARRAY[1004, 2, 1079412.0, '1.0'];

... les deux résultant en numeric[] .

Mais ARRAY[1004, 2, 1079412, 'WwLEA6XZ0V'] est illégal et à juste titre.

Les règles exactes de résolution de type pour les constructeurs de tableau peuvent être trouvées dans ce chapitre du manuel :"Conversion de type" - "UNION, CASE et constructions associées" . Votre voyage se termine à :

Depuis le littéral de chaîne 'WwLEA6XZ0V' ne peut pas être converti en integer .