【问题标题】:Postgresql : Sorting JSON array by numeric key valuePostgresql:按数字键值对 JSON 数组进行排序
【发布时间】:2018-04-09 15:59:13
【问题描述】:

我一直在阅读类似的问题,这些问题看起来有足够简单的解决方案,但在这里应用它们似乎对我不起作用。 我在 postgres 数据库表中有一个 json 列,其中包含 x 和 y 坐标。对此列执行简单的选择会返回以下示例:

[
{
 "x": "-1.6827080672804147",
 "y": "-0.011726425465745486"
},
{
 "x": "2.4016256261667235",
 "y": "0.016304356672382222"
},
{
 "x": "0.2278035109735127",
 "y": "0.0013854154958112177"
},
{
 "x": "1.2104642489702613",
 "y": "0.008129416140682903"
},
{
 "x": "-0.3281865438803838",
 "y": "-0.0024303442506510738"
},
{
 "x": "-0.2401461868455415",
 "y": "-0.0018261232803209514"
}, 
               .
               .
               .
               .
]

我想返回这个按 x 坐标升序排列的对象。上面的结果集实际上是运行以下查询的结果:

  SELECT coordinates 
    FROM schema_name.table_name
   WHERE ....
     AND ....
ORDER BY coordinates ->> 'x' asc;

我也尝试过使用

ORDER BY cast(coordinates->>'x' as numeric)  ASC

产生以下结果:

ERROR:  cannot cast type json to numeric

我确定我错过了一些愚蠢的东西。任何指向正确方向的指针将不胜感激。

【问题讨论】:

  • ORDER BY (coordinates->>'x')::NUMERIC
  • 感谢@eurotrash 的及时回复。不幸的是,虽然它没有抛出错误,但返回的 json 的顺序与我最初发布的完全相同。
  • 这个 JSON 数组是来自一个字段还是每个 x/y 来自一个单独的记录?
  • 它只是来自一个领域。

标签: json postgresql sql-order-by


【解决方案1】:

不用把事情搞得太复杂,order byjson_agg():中就可以了

create or replace function sort_my_array(json)
returns json language sql as $$
    select json_agg(value order by (value->>'x')::numeric)
    from json_array_elements($1)
$$

DbFiddle.

【讨论】:

  • 感谢@klin 的建议。这可行,可能是更优雅的解决方案。
【解决方案2】:

由于所有这些元素都在一个字段中,通过对其进行排序,您正在转换数据,因此您需要将其拆开、排序,然后将其重新组合在一起。

SELECT ('[' || STRING_AGG(j::TEXT, ',' ORDER BY (j->>'x')::NUMERIC) || ']')::JSON
FROM json_array_elements(
'[
{"x": "2.4016256261667235","y": "0.016304356672382222"},
{"x": "-1.6827080672804147","y": "-0.011726425465745486"},
{"x": "0.2278035109735127","y": "0.0013854154958112177"}
]'::JSON) j

结果:

[{“x”:“-1.6827080672804147”,“y”:“-0.011726425465745486”},{“x”:“0.2278035109735127”,“y”:“0.0013854154958112177”},{“x”:“2.423562”5662 "y": "0.016304356672382222"}]

我应该注意,我认为在更高版本的 PG 中可能有比 STRING_AGG'ing 更好的方法来构造 JSON 对象,但我使用的是 PG 9.3,所以...

【讨论】:

  • 非常好。我刚刚构建了一个包含您的建议的过程,并将其称为魅力。接受你的回答。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多