如何从postgres JSONB列获取值?

时间:2018-08-16 23:07:19

标签: json postgresql ruby-on-rails-5 jsonb postgresql-10

我有带有Rails 5应用程序的PostgreSQL 10.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

表名:property_keys。字段列表:

  • id:bigint
  • i18n_name:jsonb

以下是所有数据的请求:

enter image description here

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

这是一个请求:

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

它什么也不返回。

但是从理论上讲,应该返回填充有“ en”列的数据。

这是屏幕截图:

enter image description here

我也尝试使用->>进行查询,但该查询不起作用:

enter image description here

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

检查JSONB列的长度:

enter image description here

2 个答案:

答案 0 :(得分:3)

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

我怀疑您拥有的真正问题是,您看到的数据并不是表中存储的真正内容,这就是为什么i18_name->'en'不能工作的原因,因为没有键{{1} }。

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

en

您可以用它做什么?您可以使用select length(i18n_name::text) AS stored, length('{"en":"asdasdadad","de":"asdasdadad","ru":"asdasdadad"}') AS whatisee 数据类型转换来研究数据,也可以简单地bytea对该列中包含正确(所见)数据的行进行调查。

由于jsonb字段中将有UPDATE键,因此这将使运算符带给您真正的期望。

答案 1 :(得分:0)

您需要the ->> operator

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