如何从 postgres JSONB 列获取值?

How get values from postgres JSONB column?

我有 PostgreSQL 10.5 数据库和 Rails 5 个应用程序。

我的模型:

# == Schema Information
#
# Table name: property_keys
#
#  id         :integer          not null, primary key
#  name       :string
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  i18n_name  :jsonb
#

class PropertyKey < ApplicationRecord
  # Fields
  store :i18n_name, accessors: I18n.available_locales, coder: JSON
end

我的迁移:

class LocalizeProperties < ActiveRecord::Migration[5.2]
  def up
    add_column :property_keys, :i18n_name, :jsonb

    PropertyKey.all.each do |property_key|
      [:en, :de, :ru].each do |locale_key|
        property_key.i18n_name[locale_key] = property_key.name
      end

      property_key.save!
    end
  end

  def down
    remove_column :property_keys, :i18n_name
  end
end

Table 姓名:property_keys。字段列表:

这里是所有数据的请求:

我想获取所有英文名称(i18n_name 列中 "en" 键的值)。

这是一个请求:

SELECT
    id,
    i18n_name,
    i18n_name->'en' AS en
FROM property_keys;

而且return没什么。

但理论上应该 return 填充 "en" 列的数据。

这是截图:

我也尝试使用 ->> 进行查询,但没有成功:

我应该如何更改我的请求以及我应该使用哪个 PostgreSQL operators 来使其生效?

已检查的 JSONB 列的长度:

你需要the ->> operator:

SELECT id,
       i18n_name,
       i18n_name->>'en' AS en
  FROM property_keys;

->->> 运算符按预期工作,通过键或在后一种情况下作为文本检索 json 对象。

我怀疑您遇到的真正问题是,您看到的数据并不是真正存储在 table 中的数据,这就是 i18_name->'en' 无法工作的原因,因为有没有钥匙 en.

为了能够确认我的写作,请运行在下方查询以查看您在字符串中看到的内容的长度与存储在table 中的内容是否匹配。他们可能不会:

select
  length(i18n_name::text) AS stored,
  length('{"en":"asdasdadad","de":"asdasdadad","ru":"asdasdadad"}') AS whatisee

你可以用它做什么?使用 bytea 数据类型转换调查数据,或者只是 UPDATE 此列中包含正确(您所看到的)数据的行。

这将使操作员带来您实际期望的结果,因为 jsonb 字段中将有 en 键。

就我而言,在 psql 11 中,->->> 都适用于 json 和 jsonb 对象。

->获取带双引号("")的值,->>获取不带双引号的值。