PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres — funkcja zwracająca przecięcie 2 tablic?

Od wersji 8.4 w Postgresie są przydatne wbudowane, które sprawiają, że funkcja z pierwszej odpowiedzi jest łatwiejsza i prawdopodobnie szybsza (tak mówi mi EXPLAIN:"(cost=0.00..0.07 wiersze=1 szerokość=64)" dla tego zapytania w porównaniu . „(koszt=0.00..60.02 wierszy=1 szerokość=64)” dla oryginalnego).

Uproszczony kod to:

SELECT ARRAY
    (
        SELECT UNNEST(a1)
        INTERSECT
        SELECT UNNEST(a2)
    )
FROM  (
        SELECT  array['two', 'four', 'six'] AS a1
              , array['four', 'six', 'eight'] AS a2
      ) q;

i tak, możesz zmienić to w funkcję:

CREATE FUNCTION array_intersect(anyarray, anyarray)
  RETURNS anyarray
  language sql
as $FUNCTION$
    SELECT ARRAY(
        SELECT UNNEST($1)
        INTERSECT
        SELECT UNNEST($2)
    );
$FUNCTION$;

do którego możesz zadzwonić jako

SELECT array_intersect(array['two', 'four', 'six']
                     , array['four', 'six', 'eight']);

Ale równie dobrze możesz nazwać to także inline:

 SELECT array(select unnest(array['two', 'four', 'six']) intersect
              select unnest(array['four', 'six', 'eight']));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Agent PostgreSQL ponownie w komisji SQL Standard

  2. Tabele Postgresql istnieją, ale pobieranie relacji nie istnieje podczas wykonywania zapytania

  3. Różnica wydajności:warunek umieszczony w klauzuli INNER JOIN vs WHERE

  4. Czym różni się PostgreSQL od MySQL?

  5. Jak wydrukować wynik zapytania PostgreSQL w formacie CSV lub TSV z wiersza poleceń?