【问题标题】:How do I ORDER BY a JSON Array with its String Values?如何按 JSON 数组及其字符串值排序?
【发布时间】:2017-11-02 09:15:05
【问题描述】:

我有一个简单的 JSON 数组:

_bb jsonb =

[
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  },
  {
    "so": "1",
    "mdl": "FlashSale",
    "pos": "Bottom"
  },
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  }
]

我想要达到的目标:

[
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  },
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  },
  {
    "so": "1",
    "mdl": "FlashSale",
    "pos": "Bottom"
  }
]

我试过了

Select _bb  into _test  ORDER BY _bb->>'pos' ASC  ;

我实现的是所有 pos = "Top" 成为 JSON 中的第一个,所有 "Bottom" 成为最后一个。有没有办法在 Postgres 中实现这一点?

【问题讨论】:

  • 我不明白 ORDER BY _bb->>'pos' ASC 将如何帮助更改数组索引 - 你能分享结构吗?...也在你原来的 jsonb 中,_bb[1] 等于 _bb[3] - 对吗? . 所以你说你已经实现的就是你想要的——不是吗?
  • stackoverflow.com/questions/4088532/custom-order-by-explanation 这应该可以解决问题。您只需将其转换为您的案例
  • @VaoTsun 是的,它的_bb [3],但我想通过将“顶部”作为优先级放在“底部”之前来更改排序顺序。我不太确定实现它的语法是什么。
  • 按字母顺序,“底部”在“顶部”之前 - 这两个可能的值还是更多?..
  • @VaoTsun 可能更像“中间”...

标签: sql json postgresql jsonb


【解决方案1】:
with j(_bb) as (values('[
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  },
  {
    "so": "1",
    "mdl": "FlashSale",
    "pos": "Bottom"
  },
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  }
]'::jsonb))
, ord(o,v) as (values(1,'Top'),(2,'Bottom'))
, un as (select *,jsonb_array_elements(_bb) i from j)
select jsonb_agg(i order by o) from un
join ord on v=i->>'pos'
;

结果:

[
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  },
  {
    "so": "1",
    "mdl": "Testing",
    "pos": "Top"
  },
  {
    "so": "1",
    "mdl": "FlashSale",
    "pos": "Bottom"
  }
]

不用说你必须为所有值建立顺序矩阵,例如:

, ord(o,v) as (values(1,'Top'),(2,'Middle'),(3,'Bottom'))

http://rextester.com/ZNDQ97753

【讨论】:

  • 谢谢,但你能解释一下第一行的“t=#”吗?我不太熟悉这种语法。
  • 啊 - t=# 只是 psql 提示符,withCTE 语法
  • 菜鸟问题,但是,我应该在查询中测试谁?当我这样做时,“在或接近 t”时出现语法错误。
  • @Pickles 我更新了答案,留下没有 psql 提示或其他装饰的查询
  • 并添加了现场演示链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多