0

I would like to be able to select the rows where "likes" is greater than 50.

 {
  "id":2,
  "name":"TEST",
  "locations":[
    {
      "cityName":"NEW YORK",
      "lat":123, "lon":456,
      "likes":1000,
      "dislikes":5
    }
  ]
}
Erwin Brandstetter
  • 605,456
  • 145
  • 1,078
  • 1,228

2 Answers2

0

How about this?

SELECT * FROM mytable WHERE JSON_EXTRACT_PATH_TEXT( jsoncolumn, 'likes' )::INTEGER > 50;
djkern
  • 452
  • 3
  • 11
0

Assuming data type json and that your array always has just the one element like demonstrated:

SELECT *
FROM   tbl
WHERE  (js_column #>> '{locations,0,likes}')::int > 50;

Using the json / jsonb #>> operator that takes a text array as path. Array index starts with 0 in a JSON array (as opposed to Postgres array counting from 1).

If the array can have multiple elements (which is the point of having a array in the first place) and you want any row where at least one element record qualifies, things get more sophisticated:

SELECT *
FROM   tbl t
WHERE  EXISTS (
   SELECT FROM json_array_elements(t.js_column->'locations') elem
   WHERE  (elem->>'likes')::int > 50
   );

Related, with explanation:

Erwin Brandstetter
  • 605,456
  • 145
  • 1,078
  • 1,228