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
P.S: 我更喜欢 JSONB
, 它以分解的二进制形式存储数据并且处理速度更快 , 数据类型。对于 JSON
,请查看以下内容
假设我有一些 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
P.S: 我更喜欢 JSONB
, 它以分解的二进制形式存储数据并且处理速度更快 , 数据类型。对于 JSON
,请查看以下内容