我的表“商业行动协议”中的“数据”列似乎有问题。它应该是jsonb类型。
=# \d+ commercial_action_agreements
Column | Type |
----------------------+--------------------------+
data | jsonb |
但它看起来很奇怪,因为它是用引号标记的,而不是用引号括起来的键和值:
=# SELECT data FROM commercial_action_agreements;
data
--------------------
"{tire_count: 3}"
"{tire_count: 3}"
"{tire_count: 34}"
"{tire_count: 50}"
"{tire_count: 47}"
"{tire_count: 45}"
"{tire_count: 15}"
"{tire_count: 28}"
"{tire_count: 30}"
"{tire_count: 3}"
"{tire_count: 3}"
"{tire_count: 3}"
(12 rows)
它是{tire\u count:3},而不是{“tire\u count”:3}或{“tire\u count”:“3}
如果我试图提取'tire\u count'的值,我会得到空值:
=# SELECT data -> 'tire_count' AS tire_count FROM commercial_action_agreements;
tire_count
------------
(12 rows)
=# SELECT data -> 'tire_count' AS tire_count FROM commercial_action_agreements WHERE data->'tire_count' IS NOT NULL;
tire_count
------------
(0 rows)
如果我尝试提取键,我会发现这是一个标量(作为一个sql新手,我不知道也不明白它的含义):
=# SELECT DISTINCT jsonb_object_keys(data::JSONB) FROM commercial_action_agreements;
ERROR: cannot call jsonb_object_keys on a scalar
这个jsonb将有不止一个键/值对,所以像剪切子字符串“tire\u count:”这样的快速而肮脏的解决方案是不可行的。
我不知道为什么“data”的每个示例都是一个标量,如果它是一个标量本身就构成了一个问题。数据是通过crystal/lucky api和postman中的请求创建和(通常)访问的,因此我认为整个“数据是标量”问题可能是由序列化程序中的某些内容引起的,但这并不是(我相信)这个问题的核心。
我希望找到一种从这个jsonb中提取键和值的方法。
暂无答案!
目前还没有任何答案,快来回答吧!