将 setof bytea 连接成单个 bytea
Concat setof bytea into single bytea
我在 Postgres 12 中有一个 plpgsql 函数 returns SETOF bytea
,然后在服务器上将其制成单个 bytea
:
CREATE OR REPLACE FUNCTION public.get_tile(z integer, x integer, y integer)
RETURNS SETOF bytea
LANGUAGE plpgsql
STABLE PARALLEL SAFE
AS $function$
BEGIN
RETURN QUERY EXECUTE FORMAT('
WITH bounds AS (
SELECT ST_TileEnvelope(%s, %s, %s) AS geom
)
SELECT
ST_AsMVT(mvtgeom, ''lyr_'' || layer_id, 4096, ''geom'', ''feature_id'')
FROM (
SELECT
ST_AsMVTGeom(t.geom, bounds.geom, 4096, 0) AS geom,
id AS feature_id,
layer_id
FROM my_geom_table t, bounds
WHERE ST_Intersects(t.geom, bounds.geom)
) mvtgeom
GROUP BY layer_id',
z, x, y
);
END;
$function$;
有人告诉我,如果在查询中完成串联,流程会更有效率。我知道 bytea
可以与 ||
连接,但我不知道如何将 SETOF bytea
连接成一个。
顺便说一句,多行的原因是给每一层一个正确的名称('lyr' || layer_id
,这是几何上的列table)。
是否可以将此函数更新为 return 一行,其中包含每一层的所有图块数据?
string_agg(expression, delimiter)
也可以聚合bytea
.
CREATE OR REPLACE FUNCTION public.get_tile(z integer, x integer, y integer)
RETURNS bytea
LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
WITH bounds(geom) AS (SELECT ST_TileEnvelope(z,x,y))
SELECT string_agg(mvt, '')
FROM (
SELECT ST_AsMVT(mvtgeom, 'lyr_' || layer_id, 4096, 'geom', 'feature_id') AS mvt
FROM (
SELECT ST_AsMVTGeom(t.geom, bounds.geom, 4096, 0) AS geom
, id AS feature_id
, layer_id
FROM my_geom_table t, bounds
WHERE ST_Intersects(t.geom, bounds.geom)
) mvtgeom
GROUP BY layer_id
) sub;
$func$;
RETURNS
子句变为 bytea
。没有SETOF
.
不使用任何定界符 (''
),但如果需要可以使用。
演示简化的 SQL 函数。
这是一个简单的查询。不需要动态 SQL。甚至不需要 PL/pgSQL。
我在 Postgres 12 中有一个 plpgsql 函数 returns SETOF bytea
,然后在服务器上将其制成单个 bytea
:
CREATE OR REPLACE FUNCTION public.get_tile(z integer, x integer, y integer)
RETURNS SETOF bytea
LANGUAGE plpgsql
STABLE PARALLEL SAFE
AS $function$
BEGIN
RETURN QUERY EXECUTE FORMAT('
WITH bounds AS (
SELECT ST_TileEnvelope(%s, %s, %s) AS geom
)
SELECT
ST_AsMVT(mvtgeom, ''lyr_'' || layer_id, 4096, ''geom'', ''feature_id'')
FROM (
SELECT
ST_AsMVTGeom(t.geom, bounds.geom, 4096, 0) AS geom,
id AS feature_id,
layer_id
FROM my_geom_table t, bounds
WHERE ST_Intersects(t.geom, bounds.geom)
) mvtgeom
GROUP BY layer_id',
z, x, y
);
END;
$function$;
有人告诉我,如果在查询中完成串联,流程会更有效率。我知道 bytea
可以与 ||
连接,但我不知道如何将 SETOF bytea
连接成一个。
顺便说一句,多行的原因是给每一层一个正确的名称('lyr' || layer_id
,这是几何上的列table)。
是否可以将此函数更新为 return 一行,其中包含每一层的所有图块数据?
string_agg(expression, delimiter)
也可以聚合bytea
.
CREATE OR REPLACE FUNCTION public.get_tile(z integer, x integer, y integer)
RETURNS bytea
LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
WITH bounds(geom) AS (SELECT ST_TileEnvelope(z,x,y))
SELECT string_agg(mvt, '')
FROM (
SELECT ST_AsMVT(mvtgeom, 'lyr_' || layer_id, 4096, 'geom', 'feature_id') AS mvt
FROM (
SELECT ST_AsMVTGeom(t.geom, bounds.geom, 4096, 0) AS geom
, id AS feature_id
, layer_id
FROM my_geom_table t, bounds
WHERE ST_Intersects(t.geom, bounds.geom)
) mvtgeom
GROUP BY layer_id
) sub;
$func$;
RETURNS
子句变为 bytea
。没有SETOF
.
不使用任何定界符 (''
),但如果需要可以使用。
演示简化的 SQL 函数。
这是一个简单的查询。不需要动态 SQL。甚至不需要 PL/pgSQL。