sql >> Database teknologi >  >> RDS >> PostgreSQL

Masseopdatering i postgreSQL ved hjælp af unnest

Du ringer til unnest 3 gange på FROM klausul, det betyder, at du laver en CROSS JOIN (kartesisk produkt) af 3.

Hvis du er på PostgreSQL 9.4 eller nyere, kan du nemt foretage et opkald af unnest giver hvert array som input:

select * from 
         unnest(
            array['2001622', '2001624', '2007903'],
             array[15,14,8],
             array['type1', 'type1', 'type1'],
             array[false, true, true]
        ) as u(id, ver, type, enabled)
 

En anden mulighed, for enhver version, er at tilføje opkaldet til unnest i SELECT i stedet for FROM :

select
   unnest(array['2001622', '2001624', '2007903']) as id,
   unnest(array[15,14,8]) as ver,
   unnest(array['type1', 'type1', 'type1']) as type,
   unnest(array[false, true, true]) as enabled
 

I begge tilfælde, men især på det sidste, skal du være sikker på, at hvert array har nøjagtigt det samme antal elementer. Hvis det ikke gør det på den første metode, vil hver manglende række blive udfyldt som NULL, men den anden vil den returnere lige så mange rækker som LCM af antallet af rækker returneret af hver, hvad du sandsynligvis ikke ønsker. Eksempel:

SELECT * FROM unnest(array[1,2,3,4], array['a','b','c','d','e','f']); unnest | unnest --------+-------- 1 | a 2 | b 3 | c 4 | d [null] | e [null] | f (6 rows) SELECT unnest(array[1,2,3,4]), unnest(array['a','b','c','d','e','f']); unnest | unnest --------+-------- 1 | a 2 | b 3 | c 4 | d 1 | e 2 | f 3 | a 4 | b 1 | c 2 | d 3 | e 4 | f (12 rows)

Tjek dokumentationen om kald til tabelfunktioner for mere information.



  1. Hvordan logger man automatisk på MySQL fra et shell-script?

  2. Hvorfor bliver resultatet af COUNT dobbelt, når jeg slutter to?

  3. Java MySQL forberedt Statement Batch

  4. Hvordan kan jeg konvertere denne SQL-sætning til Django QuerySet?