#sql #postgresql #dynamic-sql #crosstab
#sql #postgresql #dynamic-sql #перекрестная таблица
Вопрос:
использование метода перекрестных таблиц для динамического поворота hstore, который предлагается здесь. Есть ли какой-либо способ мгновенно запустить возвращенный sql или есть способ создать функцию, которая вызывала бы исходную перекрестную таблицу, а затем запускала sql для возврата сводной таблицы в качестве единственного результата вместо выполнения двух запросов?
итак, когда я запускаю этот запрос
SELECT format(
$s$SELECT * FROM crosstab(
$$SELECT h.id, kv.*
FROM hstore_test h, each(hstore_col) kv
ORDER BY 1, 2$$
, $$SELECT unnest(%L::text[])$$
) AS t(id int, %s text);
$s$
, array_agg(key) -- escapes strings automatically
, string_agg(quote_ident(key), ' text, ') -- needs escaping!
) AS sql
FROM (
SELECT DISTINCT key
FROM hstore_test, skeys(hstore_col) key
ORDER BY 1
) sub;
он возвращает результат, который выглядит следующим образом:
SELECT * FROM crosstab(
$$SELECT h.id, kv.*
FROM hstore_test h
LEFT JOIN LATERAL each(hstore_col) kv ON TRUE
ORDER BY 1, 2$$
, $$SELECT unnest('{key1,key2,key3}'::text[])$$
) AS t(id int, key1 text, key2 text, key3 text);
то, что я хочу сделать, это либо с функцией, либо с другим запросом, обернутым вокруг первого. верните результаты второго запроса и используйте эти возвращенные данные для построения материализованного представления
Комментарии:
1. можете ли вы добавить дополнительную информацию в свой запрос, примерные данные и точную проблему
2. @AkhileshMishra готово
3. Вы могли бы использовать что-то вроде query_to_xml для запуска инструкции SQL. Или создать аналогичную функцию для возврата результата запроса в виде JSON
4. Если вы используете
psql
, вы могли бы использоватьgexec