J'ai un assistant qui génère du code pour faire des mises à jour en masse pour moi et génère du SQL qui ressemble à ceci:
(Les champs actifs et principaux sont de type boolean
)
UPDATE fields as t set "active" = new_values."active","core" = new_values."core"
FROM (values
(true,NULL,3419),
(false,NULL,3420)
) as new_values("active","core","id") WHERE new_values.id = t.id;
Cependant, il échoue avec:
ERROR: column "core" is of type boolean but expression is of type text
Je peux le faire fonctionner en ajoutant ::boolean
aux valeurs nulles, mais cela semble étrange, pourquoi NULL est-il considéré comme de type TEXT
?
De plus, il est un peu difficile à convertir car cela nécessiterait un peu de remaniement du code pour qu'il sache dans quel type il devrait convertir des valeurs NULL (la liste des colonnes et des valeurs est actuellement générée automatiquement à partir d'un simple tableau d'objets JSON) .
Pourquoi est-ce nécessaire et existe-t-il une solution plus élégante qui ne nécessite pas le code générateur pour connaître le type de NULL?
Si cela est pertinent, j'utilise sequelize sur Node.JS pour ce faire, mais j'obtiens également le même résultat dans le client de ligne de commande Postgres.
la source
Cannot cast type boolean to bigint in column 1
(l'erreur pointe au :: entre la première déclaration de champs)fields
a 3 colonnes,(active, core, id)
avec des types booléens, booléens et int / bigint. Votre table a-t-elle plus de colonnes ou de types différents ou les colonnes sont-elles définies dans un ordre différent?