sql >> Databáze >  >> RDS >> PostgreSQL

Hromadná aktualizace v postgreSQL pomocí unnest

Voláte unnest 3krát na FROM klauzule, to znamená, že provádíte CROSS JOIN (kartézský součin) 3.

Pokud používáte PostgreSQL 9.4 nebo vyšší, můžete jednoduše provést jedno volání unnest zadáním každého pole jako vstupu:

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)

Další možností pro jakoukoli verzi je přidat volání do unnest v SELECT místo 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

V obou případech, ale zvláště v tom posledním, si musíte být jisti, že každé pole má přesně stejný počet prvků. Pokud tomu tak není u první metody, každý chybějící řádek bude vyplněn jako NULL, ale druhý vrátí tolik řádků, kolik je LCM z počtu řádků vrácených každým, což pravděpodobně nechcete. Příklad:

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)

Zkontrolujte dokumentaci k volání funkcí tabulky pro více informací.



  1. Rozdělení logické replikace s PostgreSQL 13

  2. MySQL sklon (trend) jednoho pole (nejlépe vyhovující linie)

  3. Seznam všech tabulek v postgresql information_schema

  4. Jak sečíst hodnotu v poli JSONB v Postgresql?