sql >> Database >  >> RDS >> PostgreSQL

Postgres analoog naar CROSS APPLY in SQL Server

In Postgres 9.3 of later gebruik een LATERAL doe mee:

SELECT v.col_a, v.col_b, f.*  -- no parentheses here, f is a table alias
FROM   v_citizenversions v
LEFT   JOIN LATERAL f_citizen_rec_modified(v.col1, v.col2) f ON true
WHERE  f.col_c = _col_c;

Waarom LEFT JOIN LATERAL ... ON true ?

  • Record geretourneerd door functie heeft kolommen aaneengeschakeld

Voor oudere versies , is er een heel eenvoudige manier om te bereiken wat ik denk u probeert met een set-return-functie (RETURNS TABLE of RETURNS SETOF record OF RETURNS record ):

SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM   v_citizenversions v

De functie berekent eenmaal waarden voor elke rij van de buitenste query. Als de functie meerdere rijen retourneert, worden de resulterende rijen dienovereenkomstig vermenigvuldigd. Alle haakjes zijn syntactisch vereist om een ​​rijtype te ontleden. De tabelfunctie zou er ongeveer zo uit kunnen zien:

CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
  RETURNS TABLE(col_c integer, col_d text) AS
$func$
SELECT s.col_c, s.col_d
FROM   some_tbl s
WHERE  s.col_a = $1
AND    s.col_b = $2
$func$ LANGUAGE sql;

U moet dit in een subquery of CTE plaatsen als u een WHERE . wilt toepassen omdat de kolommen niet op hetzelfde niveau zichtbaar zijn. (En het is sowieso beter voor de prestaties, omdat je herhaalde evaluatie voor elke uitvoerkolom van de functie voorkomt):

SELECT col_a, col_b, (f_row).*
FROM (
   SELECT col_a, col_b, f_citizen_rec_modified(col1, col2) AS f_row
   FROM   v_citizenversions v
   ) x
WHERE (f_row).col_c = _col_c;

Er zijn verschillende andere manieren om dit of iets dergelijks te doen. Het hangt allemaal af van wat je precies wilt.



  1. Hoe maak je een back-up van een enkele tabel in een postgres-database?

  2. Ubuntu 18.04 voor SQL Server 2019 op virtuele machine installeren met VMware Workstation

  3. Snelle MySQL-tip:de DAYOFWEEK-functie gebruiken

  4. Query uitvoeren op PostgreSQL met Npgsql en Entity Framework met unaccent