postgresql 在 where 子句中使用 json 子元素

Posted

技术标签:

【中文标题】postgresql 在 where 子句中使用 json 子元素【英文标题】:postgresql using json sub-element in where clause 【发布时间】:2014-07-25 11:20:17 【问题描述】:

这可能是一个非常基本的问题,但我无法在网上找到任何内容。

如果我创建一个示例表:

 create table dummy ( id int not null, data json );

然后,如果我使用以下查询查询表:

select * from dummy where data->'x' = 10;

现在由于表中还没有记录,并且任何记录中都没有像“x”这样的属性,它应该返回零结果。

但我收到以下错误:

postgres=# select * from dummy where data->'x' = 10;
ERROR:  operator does not exist: json = integer
LINE 1: select * from dummy where data->'x' = 10;

但是以下查询有效:

select * from dummy where cast(data->>'x' as integer) = 10;

我在这里遗漏了什么或者类型转换是我可以从 json 字段中获取整数值的唯一方法吗?如果是这样的话,当数据变得非常大时,它不会影响性能吗?

【问题讨论】:

在这种情况下,等号右边的值也必须是字符串,否则会出错。例如postgres=# select * from dummy where data->>'x' = '10';id | data ----+----------- 1 | "x": 10 (1 row)postgres=# select * from dummy where data->>'x' = 10; ERROR: operator does not exist: text = integer LINE 1: select * from dummy where data->>'x' = 10; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 要详细说明我想说的话,如果我插入另一条 id = 10 的记录并在表 select * from dummy a, dummy b where a.id = b.data->>'x'; 上执行自联接,我仍然会遇到同样的错误。本质上,必须进行类型转换才能比较整数值 【参考方案1】:

我是否在这里遗漏了什么或者类型转换是我能得到的唯一方法 来自 json 字段的整数值?

你是对的,类型转换是从 json 字段中读取整数值的唯一方法。

如果是这样的话,是不是不影响数据时的性能? 变得非常大?

Postgres 允许您对包括强制转换在内的函数进行索引,因此下面的索引将允许您快速检索 data->>x 具有某个整数值的所有行

CREATE INDEX dummy_x_idx ON dummy(cast("data"->>'x' AS int))

【讨论】:

【参考方案2】:

JSON 运算符->> 表示Get JSON array element (or object field) as text,,因此需要进行类型转换。

您可以定义自己的 JSON 运算符,但这只会简化代码,不会影响性能。

【讨论】:

以上是关于postgresql 在 where 子句中使用 json 子元素的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 包含在 where 子句中

PostgreSQL WHERE 子句

PostgreSQL WHERE 子句

postgresql 在 where 子句中使用 json 子元素

如何在 Ruby 中使用 Where 子句 (PostgreSQL) 中的变量编写查询

Drupal 8 和 PostgreSQL:如何在 WHERE 子句中使用表达式的结果?