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

postgresql littéral de tableau mal formé dans créer un agrégat initcond

Vous avez besoin de guillemets autour de vos tableaux, et c'est parce que le tableau est dans une version texte d'une ligne.

Facile à tester en prenant votre entrée sous forme de ligne et en voyant comment postgres la formate (des guillemets simples sont nécessaires autour des tableaux ici car {} est un tableau dans le texte) :

SELECT ROW(0,NULL,NULL, 0, 0, 0, 0, '{}', '{1,2,3,4,5}', '{1,2,3,4,5}', '{0,0.25,0.5,0.75,1}')

Renvoie :

(0,,,0,0,0,0,{},"{1,2,3,4,5}","{1,2,3,4,5}","{0,0.25,0.5,0.75,1}")

Par conséquent, vous devez faire :

...
initcond = '(0,,,0,0,0,0,{},"{1,2,3,4,5}","{1,2,3,4,5}","{0,0.25,0.5,0.75,1}")'

Pourquoi les guillemets ne sont pas obligatoires sur un tableau qui est vide ou qui n'a qu'une seule valeur :

Plusieurs valeurs dans un tableau sont délimitées par des virgules et les champs d'une ligne sont également délimités par des virgules. Si vous fournissez une ligne sous la forme '(0,{1,2})' , PG l'interprétera comme trois champs :0 , {1 , 2} . Naturellement, dans ce cas, vous obtiendrez une erreur concernant un tableau mal formé. Mettre un champ entre guillemets signifie que tout ce qui se trouve entre ces guillemets est un seul champ. Donc '(0,"{1,2}")' sera interprété correctement comme 0 , {1,2} . Si le tableau est vide ou ne contient qu'une seule valeur, il n'y aura pas de virgule, il n'y a donc aucun problème à analyser correctement ce champ.