Я бы хотел иметь возможность выбрать строки, где «лайки» больше 50.
{ "id":2, "name":"TEST", "locations":[ { "cityName":"NEW YORK", "lat":123, "lon":456, "likes":1000, "dislikes":5 } ] }
Предполагая тип данных json и что в вашем массиве всегда есть только один элемент , как показано:
json
SELECT * FROM tbl WHERE (js_column #>> '{locations,0,likes}')::int > 50;
Использование оператора json / jsonb #>> , который принимает текстовый массив как path . Индекс массива начинается с 0 в массиве JSON (в отличие от подсчета массива Postgres от 1 ).
#>>
Если в массиве может быть несколько элементов (что означает наличие массива в первую очередь), и вам нужна любая строка, в которую может быть включена хотя бы одна запись элемента, вещи стань более изощренным:
SELECT * FROM tbl t WHERE EXISTS ( SELECT FROM json_array_elements(t.js_column->'locations') elem WHERE (elem->>'likes')::int > 50 );
Связано с объяснением:
Как насчет этого?
SELECT * FROM mytable WHERE JSON_EXTRACT_PATH_TEXT( jsoncolumn, 'likes' )::INTEGER > 50;