Как сравнить числовые значения в PostgreSQL JSONB - PullRequest
0 голосов
/ 19 декабря 2018

Я столкнулся со странной ситуацией, работая с типом jsonb.

Ожидаемое поведение


Использование структуры short jsonb:

{"price": 99.99}

Я написал запрос следующим образом:

 SELECT * FROM table t WHERE t.data->price > 90.90

И он не работает с ошибкой operator does not exist: jsonb > numeric Так же, как текст (->>) operator does not exist: text > numeric

Затем я написал сравнение какупоминается во многих источниках:

SELECT * FROM table t WHERE (t.data->>price)::NUMERIC > 90.90

И все работает как положено.

Что странно:


SELECT * FROM table t WHERE t.data->price > '90.90';

немного странноно запрос выше работает правильно.

ОБЪЯСНЕНИЕ: Filter: ((data -> 'price'::text) > '90.90'::jsonb)

Но если я изменю значение jsonb на text как: {"price": "99.99"}, то результата больше нет - пусто.

Вопрос : Как на самом деле PostgreSQL сравнивает числовые данные и какой предпочтительный способ проведения такого сравнения.

1 Ответ

0 голосов
/ 19 декабря 2018

Но вы не сравниваете числовые данные, не так ли?

Я вижу, что вы думаете, price содержит число, но это не так.Содержит значение JSON.Это может быть числом, или это может быть текст, или массив, или объект, или объект, содержащий массивы объектов, содержащих ...

Вы можете сказать «но ключназывается 'цена', конечно, это число ", но это бесполезно для PostgreSQL, особенно если я приду и украдкой вставлю объект, содержащий массивы объектов, содержащих ... 1

Итак, если вы хотите, чтобы число сравнивалось с вами, вам нужно преобразовать его в число (t.data->>price)::NUMERIC или преобразовать целевое значение в JSON и позволить PostgreSQL выполнить сравнение на основе JSON (которое может делать то, что вы хотите,это может не произойти - я не знаю, какие именно правила для JSON).


1 И это именно то, что я бы сделал, хотя это Рождество,Я плохой человек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...