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

Předání pole polí jako parametru funkci

Líbí se mi váš druhý přístup.

SELECT DISTINCT t.*
FROM   (VALUES (1, 4), (5, 1), (2, 3), (1, 4), (7, 3), (7, 4)) AS t(a, b)
JOIN   (
   SELECT arr[1]::int[] AS a1
         ,arr[2]::int[] AS b1
   FROM   (
      SELECT unnest(ARRAY['{"{1,2}", "{3,4}"}'
                         ,'{"{}"   , "{4,5,6}"}'
                         ,'{"{5}"  , "{}"}'    -- added element to 1st dimension
                         ])::text[] AS arr     -- 1d text array
      ) sub
   ) s ON (a = ANY(a1) OR a1 = '{}')
      AND (b = ANY(b1) OR b1 = '{}')
;

Navrhuje pouze drobná vylepšení:

  1. Poddotazy místo CTE pro mírně lepší výkon.

  2. Zjednodušený test pro prázdné pole:kontrola proti doslovnému '{}' místo volání funkce.

  3. O jednu úroveň poddotazu méně pro rozbalení pole.

Výsledek:

a | b
--+---
2 | 3
7 | 4
1 | 4
5 | 1

Pro běžného čtenáře:Zabalení vícerozměrného pole integer je nezbytné, protože Postgres to vyžaduje (cituji chybovou zprávu):

Alternativní trasa bude s dvourozměrným textovým polem a zrušte jeho vnoření pomocí generate_subscripts() :

WITH a(arr) AS (SELECT '{{"{1,2}", "{3,4}"}
                        ,{"{}", "{4,5,6}"}
                        ,{"{5}", "{}"}}'::text[]   -- 2d text array
             )
SELECT DISTINCT t.*
FROM  (VALUES (1, 4), (5, 1), (2, 3), (1, 4), (7, 3), (7, 4)) AS t(a, b)
JOIN  (
   SELECT arr[i][1]::int[] AS a1
         ,arr[i][2]::int[] AS b1
   FROM   a, generate_subscripts(a.arr, 1) i       -- using implicit LATERAL
   ) s ON (t.a = ANY(s.a1) OR s.a1 = '{}')
      AND (t.b = ANY(s.b1) OR s.b1 = '{}');

Mohlo by to být rychlejší, můžete otestovat?

Ve verzích před 9.3 by se používal explicitní CROSS JOIN místo bočního křížového spojování.




  1. Jak ladit php/MySQL COUNT(id) vrací 1 místo celkové hodnoty položek

  2. Glassfish Admin Console při vytváření JDBC Pool vyvolá výjimku java.lang.IllegalStateException

  3. 7 způsobů, jak najít duplicitní řádky na serveru SQL při ignorování jakéhokoli primárního klíče

  4. Žádné ukládání plánu provádění do mezipaměti pro dynamické SQL v PostgreSQL 9.4?