2016-07-21 1 views
1

Alors, laisse dire que j'ai deux tableaux commandés avec le même nombre d'éléments où chaque indice de chaque tableau se réfère à l'autre au même indicerequête de mise à jour unique de deux tableaux commandés

values = [ 5, 7, 8, 9 ] 
keys = ['a', 'b', 'c', 'd' ] 

au lieu de faire plusieurs mises à jour dans une boucle

for thing, index in values 
    UPDATE table SET column1 = thing WHERE column2 = keys[index] 

est-il un moyen de tirer ces tableaux dans Postgres et les utiliser dans une seule requête UPDATE?

Quelque chose comme:

UPDATE table SET column1 = values[?] WHERE column2 = keys[?] 
+0

il ny a pas de façon directe. Vous avez besoin de convertir ces deux tableaux dans une table avec unstart http://stackoverflow.com/questions/8760419/postgresql-unnest-with-element-number –

+0

Si vous stockez les clés et les valeurs ensemble dans un objet hstore ou json, il serait assez facile à faire mais rien de direct. – Wolph

Répondre

1

Oui il y a un moyen.

En supposant Postgres 9.5 actuel puisque vous n'avez pas spécifié. Utilisez la nouvelle forme de unnest() à unnest plusieurs tableaux en parallèle:

Et utiliser la table dérivée dans une plaine UPDATE:

UPDATE tbl t 
SET column1 = a.value 
FROM unnest ('{5, 7, 8, 9}'::int[] 
       ,'{a, b, c, d}'::text[]) AS a(value, key) 
WHERE t.column2 = a.key;