【问题标题】:How to deal with JSON column while using GROUP BY使用 GROUP BY 时如何处理 JSON 列
【发布时间】:2021-05-20 13:19:49
【问题描述】:

我正在使用类似于下面的查询,地址是 JSON TYPE。

SELECT id, name, MAX(salary), age, adress FROM test group by id, name, age

但出现以下错误:

SQL Error [42883]: ERROR: could not identify an equality operator for type json
  Position: 152

我正在尝试获取具有最高工资的人的数据,我需要包含应为 JSON 格式的地址

那么,有什么办法可以做到这一点,或者这实际上可能吗?

注意:-postgres db

【问题讨论】:

  • 也许是DISTINCT ON()
  • 不,刚刚尝试了 DISTINCT。但同样的问题。
  • 请提供样本数据和所需的输出
  • edit你的问题(通过点击下面的edit链接)并添加一些示例数据和基于该数据的预期输出为formatted text .请参阅here,了解有关如何创建漂亮的文本表格的一些提示。 (edit 您的问题 - 请不要将代码或其他信息放入 cmets)

标签: sql json postgresql


【解决方案1】:

我会选择DISTINCT ON()

SELECT DISTINCT ON (age) id, name, salary, age, adress
FROM test
ORDER BY age, salary desc

DISTINCT ON (age) 将为每个年龄提供一行。 ORDER BY 决定的薪水最高的人。

【讨论】:

  • 可以通过 DISTINCT ON 实现。谢谢你,先生。您之前在评论部分给出了使用 DISTINCT ON 的提示,但我没有正确使用 DISTINCT 所以无法实现。无论如何它现在工作了,感谢您的时间。
【解决方案2】:

对于 JSON 类型没有内置的相等运算符,但对于 JSONB 类型。所以你有几个直接的选择:

  • 将列 adress 的类型从 JSON 更改为 JSONB(推荐)。然后您的查询将起作用;
  • 转换 adress 以在查询中键入 JSONB
SELECT id, name, MAX(salary), age, adress::jsonb 
  FROM test 
 GROUP BY id, name, age, address::jsonb;

您也可以自己 define 为 JSON 类型创建一个相等运算符 - 好吧,与其作为生产目的,不如作为练习。

【讨论】:

  • 使用了强制转换选项。但它给出了所有的记录。如果我从选择和分组中删除地址,那么功能就可以了。
  • 我不清楚你想要达到什么目的。如果超过一个人的最高工资是他的年龄怎么办?可能查询会非常不同。
  • 我只在这里发布了一个例子。实际问题出在不同表之间的不同场景中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2013-01-21
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多