PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как можете да разширите съкратен ред на PostgreSQL в отделни колони?

9.3 и по-горе:странично запитване

В PostgreSQL 9.3 или по-нова използвайте имплицитна странична заявка:

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

Предпочитайте тази формулировка за всички нови заявки . Горното е стандартната формула .

Освен това работи правилно с функции, които RETURNS TABLE или RETURNS SETOF RECORD както и функции с изходящи параметри, които RETURNS RECORD .

Това е съкращение за:

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

Преди 9.3:разширение със заместващи знаци (внимателно)

Предишни версии, причинява многократна оценка на some_function , не работи, ако some_function връща набор, не използвайте това :

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

Предишни версии, избягва многократно оценяване на some_function използвайки втори слой индиректност. Използвайте това само ако трябва да поддържате доста стари версии на PostgreSQL.

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

Демо:

Настройка:

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);

тестово изпълнение:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да променя схемата на множество PostgreSQL таблици в една операция?

  2. Грешка:INTO е указано повече от веднъж на или близо до INTO

  3. Как да направите външен ключ с ограничение върху референтната таблица в PostgreSQL

  4. Грешка при създаване на разширение без акцент на PostgreSQL

  5. GROUP или DISTINCT след JOIN връща дубликати