获取postgresql中所有json字段键的数组

Amj*_*ari 6 postgresql

我有一个名为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}}}
Run Code Online (Sandbox Code Playgroud)

此记录具有blockList对象,该对象包含被阻止用户的对象.我需要的是返回像这样的所有块列表键的数组

["199", "215", "219", "225", "229"]
Run Code Online (Sandbox Code Playgroud)

任何帮助我怎么能写一个plpgsql函数来做到这一点(返回数组中的所有对象键)?我是psotgresql的初学者,需要帮助.

Mar*_*rth 9

用于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)
Run Code Online (Sandbox Code Playgroud)

注意:
如果您使用的是jsonb类型(而不是那个json),则需要使用json b _object_keys函数.

  • 如果您使用的是`jsonb`,那么您需要使用`jsonb_object_keys` 函数。 (3认同)
  • 错误:函数 json_object_keys(jsonb) 不存在 第 4 行:选择 json_object_keys(friends->'blockList') f ^ 提示:没有函数与给定名称和参数类型匹配。您可能需要添加显式类型转换。 (2认同)