查询值存在且位于x的hstore字段

时间:2017-09-19 12:00:35

标签: ruby-on-rails postgresql

我有一个Widgets模型,它有大约3个核心活动记录。一列名为'form_values',其格式为:

"{\"a\":1,\"b\":2}"
{"a" => "1", "b" => "2", "product_type" => "1"}.to_json

我需要查询其form_values包含键a并且其值为1的所有活动记录。

我写了一些不起作用的东西,比如:

required_widgets = Widget.find_by_sql("select id from  (select id, form_values from widgets where form_values!= '' and form_values::jsonb?'' and form_values::json->>'product_type' = '1') as required_widgets where (form_values::json->'a')::jsonb?'1' ")

1 个答案:

答案 0 :(得分:0)

如果你使用的是postgresql支持的hstore data type,那就很容易了:

您的两个用例都是described in the docs

1:检查是否定义了值

  

hstore?文本

所以对于你的用例

form_values::hstore ? 'a'

2:选择(并比较)一个值

  

hstore - >文本

所以对于你的用例

form_values -> product_type 
# this returns '1'

3:将它们添加到查询中

SELECT * FROM widgets
WHERE form_values::hstore ? 'a'
AND (form_values -> a)::integer = 1

您也可以将其中的部分内容包装到ActiveRecord中:

Widget.where(
  form_values::hstore ? 'a' 
  AND (form_values -> a)::integer = 1
)

* :: integer 将字符串值强制转换为整数。查询a > 2

的记录时,这会派上用场