如何使用=运算符查询Postgres JSONB数组

时间:2019-03-05 13:55:32

标签: postgresql activeadmin jsonb

我正在寻找一种使用=子句查询postgres jsonb数组字段的方法。

假设我有一张桌子

CREATE TABLE events( id integer, tags jsonb, PRIMARY KEY(id) );

具有类似['Google', 'Hello World', 'Ruby']

的值的标签

我经历过Stackover Flow并且做了类似的事情。

形成的SQL就像SELECT "events".* FROM "events" WHERE ("events"."tags" @> '{google}') ORDER BY "business_events"."id" desc;

通过运行此命令,我得到此错误=>

ERROR: invalid input syntax for type json LINE 1: ...siness_events" WHERE ("business_events"."tags" @> '{google}'... ^ DETAIL: Token "google" is invalid. CONTEXT: JSON data, line 1: {google...

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

the operator @>的右操作数应为有效的json

WITH events(id, tags) AS (
VALUES
    (1, '["Google", "Hello World", "Ruby"]'::jsonb)
)

SELECT events.* 
FROM events 
WHERE tags @> '["Google"]'

 id |               tags                
----+-----------------------------------
  1 | ["Google", "Hello World", "Ruby"]
(1 row)

请注意,json对象的键和文本值用双引号引起来。

该运算符按原样接受参数,因此无法使其不区分大小写。您可以使用函数jsonb_array_elements_text()完成此操作:

SELECT events.*
FROM events 
CROSS JOIN jsonb_array_elements_text(tags)
WHERE lower(value) = 'google';

第二种解决方案价格昂贵,the cited answer中的注释也适用于此。