PostgreSQL return 来自 JSON 列的 JSON 只有 key/values 键在 python 列表中

PostgreSQL return a JSON from JSON column with only key/values for which the key is in a python list

假设我有一些 PostgreSQL table ('table_1'),我想从 Python 脚本中 select。此 table 有一个包含 JSON 数据的列(称为 'json_data'),如下所示,例如:

{'4369': 2, '8465': 1, '12561': 1, '12562': 1}

现在我在 Python 中有一个如下所示的列表:

[4369, 8465, 12561, 16657]

我的目标是 return 来自 postgresql table 的 JSON/dict 只包含 key/value 对,其密钥在 Python每行的列表。对于上述情况,我因此希望 JSON returned 为:

{'4369': 2, '8465': 1, '12561': 1}

我的猜测是它必须看起来有点像这样,但我不知道在“...”处必须做什么

SELECT json_data ->> ... IN 'python_list'
FROM table_1

示例,简单来说 SQL 并使用 CTE 模仿您的 table:

WITH i AS (
    SELECT  '{"4369": 2, "8465": 1, "12561": 1, "12562": 1}'::json AS json_data
)
SELECT  *
FROM    i, -- your table name
        json_each(json_data)
WHERE   key::int =any(ARRAY[4369, 8465, 12561, 16657]);

函数 json_each(或使用 jsonb 数据类型时 jsonb_each)可以解决问题。

我希望你能把它变成对python有用的东西。

您可以在包含 JOIN 的 SELECT 语句中一起使用 JSONB_OBJECT_AGG()JSONB_EACH()JSONB_ARRAY_ELEMENTS() 函数,以便将 dict 对象的元素与键匹配JSON 个对象,例如

SELECT JSONB_OBJECT_AGG( j1.key, j1.value ) AS js_data
  FROM table_1 t
 CROSS JOIN JSONB_EACH(json_data) AS j1 
  JOIN JSONB_ARRAY_ELEMENTS('[4369, 8465, 12561, 16657]'::JSONB) AS j2
    ON j2.value::INT = j1.key::INT

Demo

P.S: 我更喜欢 JSONB, 它以分解的二进制形式存储数据并且处理速度更快 , 数据类型。对于 JSON,请查看以下内容

Demo2