Подтвердить что ты не робот

Postgresql с использованием подэлемента json в where where

Это может быть очень простой вопрос, но я не могу найти что-либо в этом онлайн-режиме.

Если я создаю таблицу образцов:

 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;

Я что-то упустил, или typecasting - единственный способ получить целочисленное значение из поля json? Если это так, не влияет ли это на производительность, когда данные становятся чрезвычайно большими?

4b9b3361

Ответ 1

Я что-то упустил, или приведение типов - единственный способ получить целочисленное значение из json-поля?

Вы правы, typecasting - единственный способ прочитать целочисленное значение из поля json.

Если это так, не влияет ли это на производительность, когда данные становится чрезвычайно большим?

Postgres позволяет вам индексировать функции, включая касты, поэтому приведенный ниже индекс позволит вам быстро получить все строки, где данные → > x имеют некоторое целочисленное значение

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