sql >> Database >  >> RDS >> PostgreSQL

Hoe kun je een gecondenseerde PostgreSQL-rij uitbreiden naar afzonderlijke kolommen?

9.3 en hoger:laterale zoekopdracht

Gebruik in PostgreSQL 9.3 of nieuwer een impliciete laterale query:

SELECT f.* FROM things t, some_function(t.thing_id) f;

Geef de voorkeur aan deze formulering voor alle nieuwe zoekopdrachten . Het bovenstaande is de standaard formulering .

Het werkt ook goed met functies die RETURNS TABLE of RETURNS SETOF RECORD evenals functies met out-params die RETURNS RECORD .

Het is een afkorting voor:

SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;

Pre-9.3:wildcard-uitbreiding (met zorg)

Eerdere versies veroorzaken meervoudige evaluatie van some_function , doet niet werk als some_function retourneert een set, gebruik dit niet :

SELECT (some_function(thing_id)).* FROM things;

Eerdere versies, vermijdt meervoudige evaluatie van some_function met behulp van een tweede laag van indirectheid. Gebruik dit alleen als u vrij oude PostgreSQL-versies moet ondersteunen.

SELECT (f).*
FROM (
  SELECT some_function(thing_id) f
  FROM things
) sub(f);

Demo:

Opstelling:

CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
  RAISE NOTICE 'evaluated with %',i;
  x := i;
  y := i::text;
  z := 'dummy';
  RETURN;
END;
$$;

create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);

testrun:

demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>     SELECT (some_function(thing_id)).* FROM things;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>  SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)


  1. is er een manier om alle mislukte sql-instructies in orakel 10g te loggen?

  2. Is er een manier om de standaard tijdstempels van Rails te wijzigen in Y-m-d H:i:s (in plaats van Y-m-d H:i:s.u) of om laravel het decimale gedeelte van Y-m-d H:i:s.u te laten negeren?

  3. Het databasewachtwoord wijzigen

  4. Oracle verbinden met PostgreSQL