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

Man*_*ngh 20 sql database postgresql json postgresql-9.3

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

如果我创建一个示例表:

 create table dummy ( id int not null, data json );
Run Code Online (Sandbox Code Playgroud)

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

select * from dummy where data->'x' = 10;
Run Code Online (Sandbox Code Playgroud)

现在由于表中没有记录,并且在任何记录中都没有'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;
Run Code Online (Sandbox Code Playgroud)

但是以下查询工作:

select * from dummy where cast(data->>'x' as integer) = 10;
Run Code Online (Sandbox Code Playgroud)

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

Fuz*_*ree 14

我在这里遗漏了什么或者类型转换是我从json字段获取整数值的唯一方法吗?

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

如果是这种情况,当数据变得非常大时,它是否不会影响性能?

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

CREATE INDEX dummy_x_idx ON dummy(cast("data"->>'x' AS int))
Run Code Online (Sandbox Code Playgroud)


kli*_*lin 5

JSON运算符->>意味着将JSON数组元素(或对象字段)作为文本,因此需要进行类型转换.

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