我有一个名为user的表,并且在表内有一个名为friends的字段,这个字段是一个json类型,其值如下例所示
{"blockList": {"199": {"date": 1453197190, "status": 1}, "215": {"date": 1459325611, "status": 1}, "219": {"date": 1454244074, "status": 1}, "225": {"date": 1453981312, "status": 1}, "229": {"date": 1459327685, "status": 1}}, "followers": {"211": {"date": 1452503369}, "219": {"date": 1452764627}, "334": {"date": 1456396375}}, "following": {"215": {"date": 1459325619}, "219": {"date": 1453622322}, "226": {"date": 1454244887}, "229": {"date": 1459327691}}, "friendList": {"213": {"date": 1453622410, "type": 2, "status": 1}, "214": {"date": 1452763643, "status": 1}, "215": {"date": 1455606872, "type": 2, "status": 2}, "218": {"date": 1453280047, "status": 1}, "219": {"date": 1453291227, "status": 2}, "221": {"date": 1453622410, "type": 2, "status": 1}, "224": {"date": 1453380152, "type": 2, "status": 1}, "225": {"date": 1453709357, "type": 2, "status": 2}, "226": {"date": 1454244088, "type": 2, "status": 1}, "229": {"date": 1454326745, "type": 2, "status": 2}}}
此记录包含一个blockList对象,该对象包含被阻止用户的对象。 我需要的是返回所有块列表键的数组,如此
["199", "215", "219", "225", "229"]
任何帮助如何编写plpgsql函数来执行此操作(返回数组中的所有对象键)? 我是psotgresql的初学者,需要帮助。
答案 0 :(得分:6)
将json_object_keys
用于包含json对象最外层键的集合(因此您需要选择blockList
键的对象,您可以使用friends->'blockList'
}),并使用array_agg
将它们聚合成一个数组:
SELECT ARRAY_AGG(f)
FROM (
SELECT json_object_keys(friends->'blockList') f
FROM users
) u;
┌───────────────────────┐
│ array_agg │
├───────────────────────┤
│ {199,215,219,225,229} │
└───────────────────────┘
(1 row)
注意:强>
如果您使用jsonb
类型(而不是json
类型),则需要使用json b _object_keys函数。
答案 1 :(得分:3)
SELECT array_agg(ks) FROM (
SELECT json_object_keys(friends->'blockList') AS ks
FROM users
) x
我创建了一个SQL小提琴here来演示。
注意:user
是保留字,因此我调用了表users
。