【问题标题】:PG::InvalidParameterValue: ERROR: cannot extract element from a scalarPG::InvalidParameterValue: 错误: 无法从标量中提取元素
【发布时间】:2020-10-06 09:26:09
【问题描述】:

我正在使用以下查询从 JSON 列中获取数据。

SELECT id FROM ( SELECT id,JSON_ARRAY_ELEMENTS(shipment_lot::json) AS js2 FROM file_table WHERE ('shipment_lot') = ('shipment_lot') ) q WHERE js2->> 'invoice_number' LIKE  ('%" abc1123"%')

我的 Postgresql 版本是 9.3

JSON 列中保存的数据:

[{ "id"=>2981, "lot_number"=>1, "activate"=>true, "invoice_number"=>"abc1123", "price"=>378.0}]

但是,我收到了这个错误:

ActiveRecord::StatementInvalid (PG::InvalidParameterValue: ERROR:  cannot extract element from a scalar:
SELECT id FROM 
  ( SELECT id,JSON_ARRAY_ELEMENTS(shipment_lot::json) 
    AS js2 FROM file_heaps 
    WHERE ('shipment_lot') = ('shipment_lot') ) q 
WHERE js2->> 'invoice_number' LIKE  ('%abc1123%'))

我该如何解决这个问题。

【问题讨论】:

  • 那不是有效的 JSON,这可能是你的问题。我建议改用 jsonb 列,您可以只插入一个散列,rails 会在插入/选择时将其转换为散列
  • 实际上,直到昨天,这段代码都在使用相同的数据集。所以我非常需要使用相同的查询。
  • 那不可能,那不是 JSON,它永远无法使用 ::json 进行转换
  • 如您所见,我只需要上述查询中的“id”

标签: sql ruby-on-rails json postgresql


【解决方案1】:

您的问题是您存储的 JSON 不正确

如果您尝试在 postgres 上运行示例数据,它将无法运行

SELECT ('[{ "id"=>2981, "lot_number"=>1, "activate"=>true, "invoice_number"=>"abc1123", "price"=>378.0}]')::json

这是格式正确的 JSON:

SELECT ('[{ "id":2981, "lot_number":1, "activate":true, "invoice_number":"abc1123", "price":378.0}]')::json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2020-03-29
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多