gpt4 book ai didi

postgresql - 合并来自多行的 hstore 数据

转载 作者:行者123 更新时间:2023-11-29 14:07:06 28 4
gpt4 key购买 nike

假设我有一个定义如下的表:

CREATE TABLE test (
values HSTORE NOT NULL
);

想象一下,我插入了几条记录,结果如下:

values
-----------------------------
"a"=>"string1","b"=>"string2"
"b"=>"string2","c"=>"string3"

有什么方法可以进行聚合查询,为我提供一个新的 hstore,其中包含所有行的合并键(和值)。

伪查询:

SELECT hstore_sum(values) AS value_sum FROM test;

期望的结果:

value_sum
--------------------------------------------
"a"=>"string1","b"=>"string2","c"=>"string3"

我知道每个键的不同值可能存在冲突,但在我的例子中,选择哪个值的顺序/优先级并不重要(它甚至不必是确定性的,因为它们对于相同的 key )。

这是否可能开箱即用,还是您必须使用一些特定的自制 SQL 函数或其他函数来完成?

最佳答案

你可以做很多事情,f.ex:

我的第一个想法是使用 each()函数,并分别聚合键和值,例如:

SELECT  hstore(array_agg(key), array_agg(value))
FROM test,
LATERAL each(hs);

但这表现最差。

您可以使用 hstore_to_array()功能也一样,构建一个键值改变数组,如(@JakubKania):

SELECT  hstore(array_agg(altering_pairs))
FROM test,
LATERAL unnest(hstore_to_array(hs)) altering_pairs;

但这还不完美。

您可以依靠 hstore 值的表示,并构建一个字符串,它将包含您所有的对:

SELECT  hstore(string_agg(nullif(hs::text, ''), ','))
FROM test;

这是相当快的。但是,如果您愿意,可以使用 custom aggregate function (可以使用内置的 hstore 连接):

CREATE AGGREGATE hstore_sum (hstore) (
SFUNC = hs_concat(hstore, hstore),
STYPE = hstore
);

-- i used the internal function (hs_concat) for the concat (||) operator,
-- if you do not want to rely on this function,
-- you could easily write an equivalent in a custom SQL function

SELECT hstore_sum(hs)
FROM test;

SQLFiddle

关于postgresql - 合并来自多行的 hstore 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25846892/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com