sql—无法从标量/jsonb中提取数据

lvjbypge  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(308)

我的表“商业行动协议”中的“数据”列似乎有问题。它应该是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中提取键和值的方法。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题