Postgrest api - Отбор по в массиве jsonb
Есть таблица
users
- name text
- objects jsonb
name objects
alik [2,3,4]
tolik [45,78,34]
katy [2,4,6]
Использую postgrest api, нужно получить только те записи у которых значение в массиве jsonb совпадает с 2
query = "/users?objects@>[2]";
выдает все записи, а нужно
name objects
alik [2,3,4]
katy [2,4,6]
также есть таблица types
name -text objects - jsonb
tapok [{"id":1, "total":10},{"id":2, "total":50},{"id":3, "total":10}]
shot [{"id":5, "total":10},{"id":7, "total":50},{"id":2, "total":10}]
body [{"id":3, "total":10},{"id":2, "total":50},{"id":1, "total":10}]
Как правильно записать запрос с отбором по id в колонке objects?
const id = 2;
query = "/types?objects->>id=eq."+id";
неработает.
Ответы (1 шт):
Для начала обязательное предупреждение, что если у вас часто возникает надобность в подобных операциях, то лучше нормализовать схему далее.
Вы не указали версию. В PostgreSQL версии 12 и позже можно воспользоваться запросом SQL/JSON Path:
SELECT *
FROM users
WHERE objects @? '$[*] ? (@ == 2)'
;
Так как у вас PostgREST, а он не поддерживает синтаксис SQL/JSON Path, вам придётся использовать несовместимый язык из предыдущих версий PostgreSQL:
SELECT *
FROM users
WHERE objects @> CAST('[2]' AS JSONB)
;
Если судить по документации, это у вам будет что-то типа:
/users?objects=cs.{2}