这可能是一个非常基本的问题,但我在网上找不到任何东西.

如果我创建一个示例表:

 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字段中获取整数值的唯一方法?如果是这样的话,当数据变得非常大时,它不会影响性能吗?

推荐答案

我是不是漏掉了什么,还是排版是我唯一能得到的方法? json字段中的整数值?

您是正确的,类型转换是从json字段读取整数值的唯一方式.

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

Postgres allows you to index functions including casts, so the index below will allow you to quickly retrieve all rows where data->>x has some integer value

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

Database相关问答推荐

使用 golan 查询 mongodb 中的集合并返回 id 作为字符串

utf-8 与 latin1

任何必要的可空外键示例?

MYSQL CASE 语句多条件

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

MySQL解释更新

Java中基于文件的数据库

在 SQL Server 中存储属性的最佳模式是什么?

返回 DataSet/DataTable 的 PowerShell 函数中的奇怪行为

NameError:设置更改为 mysql 后未定义名称_mysql

在 PostgreSQL 中使用 pg_notify(text, text) 监听/通知

MySQL是否允许使用点创建数据库?

哪个提供更好的性能一个大连接或多个查询?

没有自动增量的sqlalchemy主键

如何在 liquibase 中标记变更集以进行回滚

我应该在数据库模式中允许空值吗?

MongooseJS - 如何找到具有最大值的元素?

Android - ViewHolder 模式是否在 CursorAdapter 中自动实现?

Codeigniter - 使用多个数据库

For循环或数据库调用哪个更好?