使用大于/小于搜索 Postgres JSON 类型

Nom*_*ron 1 postgresql json ruby-on-rails

我正在使用 Rails 4 作为 api 以 JSON 数据类型存储散列,并且需要在散列中搜索满足<&>条件的值。

例如,使用像 {location: {"lat": -112, "lng": 33}} 这样的散列,我需要能够找到一系列经纬度。

就像是:

Place.where("location ->> "lng" < -111 && > -113)
Run Code Online (Sandbox Code Playgroud)

Postgres 9.3 似乎并不支持这一点,但有没有办法在不使用以下内容的情况下解决这个问题:

Place.all.select { |place| place.location["lng"] < -111 && > -113 }
Run Code Online (Sandbox Code Playgroud)

Nom*_*ron 6

我之前如何查询这个Place.where("location ->> 'lng' < ?", -111)有点不正确

出于某种原因,您必须按文本进行搜索(我相信有人可以在评论中回答为什么会这样),因此稍微更改查询以使其Place.where("location ->> 'lng' < ?", "-111")似乎有效!

  • 您的新查询有效,因为 -&gt;&gt; 运算符返回类型为 `text` 的数据。您想要做的是将其转换为带有 `::int` 的整数。我假设以下查询可以工作:`Place.where("(location-&gt;&gt;'lng')::int &lt; ?", -111)` (2认同)
  • 如果您的 postgres 版本 &gt;= 9.3,那么您还可以使用:`Place.where("(location -&gt;&gt; 'lng')::numeric &lt; ?", -111)`。如果您的值具有浮点类型,这会很有用。 (2认同)