Таблица как параметр в Postgresql
4 мин
Часто видно жалобы на то, что параметры "не работают". Как же они не работают?
А вот так:
А вот так:
select * from $1 where ...;
Формальный непроцедурный язык программирования
select * from $1 where ...;

В ежедневной работе часто встает задача ясно и просто ссылаться на большие списки колонок и выражений в выборке, и/или обходиться с громоздкими и неясными условиями в предложении where. Обычно для этих целей используются представления, что вполне удобно и наглядно.

Давным-давно (кажется, в прошлую среду) попался ко мне в руки дамп базы данных MySQL, который следовало немедленно развернуть на моей машине. Зачем это было нужно и откуда взялся дамп, рассказывать не буду, вряд ли это кому-то интересно. Важно то, что дамп был от MySQL 4.1.22 и снят он был при помощи одного широко известного инструмента (версии 5.23). 

QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Sort (cost=146.63..148.65 rows=808 width=138) (actual time=55.009..55.012 rows=71 loops=1)
Sort Key: n.nspname, p.proname, (pg_get_function_arguments(p.oid))
Sort Method: quicksort Memory: 43kB
-> Hash Join (cost=1.14..107.61 rows=808 width=138) (actual time=42.495..54.854 rows=71 loops=1)
Hash Cond: (p.pronamespace = n.oid)
-> Seq Scan on pg_proc p (cost=0.00..89.30 rows=808 width=78) (actual time=0.052..53.465 rows=2402 loops=1)
Filter: pg_function_is_visible(oid)
-> Hash (cost=1.09..1.09 rows=4 width=68) (actual time=0.011..0.011 rows=4 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 1kB
-> Seq Scan on pg_namespace n (cost=0.00..1.09 rows=4 width=68) (actual time=0.005..0.007 rows=4 loops=1)
Filter: ((nspname <> 'pg_catalog'::name) AND (nspname <> 'information_schema'::name))


DECLARE @t TABLE (lod_id INT PRIMARY KEY, last_log SMALLDATETIME, size INT)
INSERT INTO @t
EXEC sys.xp_enumerrorlogs
SELECT lod_id, last_log, size_mb = size / 1048576.
FROM @t
lod_id last_log size_mb
-------- --------------------- ---------------
0 2016-01-05 08:46:00 567.05288505
1 2015-12-31 12:53:00 1370.39249420
2 2015-12-18 11:32:00 768.46394729
3 2015-12-02 13:54:00 220.20050621
4 2015-12-02 13:16:00 24.04152870
5 2015-11-16 13:37:00 80.07946205
6 2015-10-22 12:13:00 109.33527946


Содержание
Есть три агрегатные функции, которые чаще всего используются на практике: COUNT, SUM и AVG.


