我有这样的记录:
id, hstore_col
1, {a: 1, b: 2}
2, {c: 3, d: 4}
3, {e: 1, f: 5}
如何在hstore中为任何属性按最大/最小值排序?
结果应该是这样的(按最低顺序排列):
id, hstore_col
1, {a: 1, b: 2}
3, {e: 1, f: 5}
2, {c: 3, d: 4}
我知道,我只能通过以下特定属性对其进行排序:my_table.hstore_fields -> 'a'
,但它对我的问题不起作用。
答案 0 :(得分:4)
使用avals
转换为数组,并将结果数组从文本转换为整数。然后对数组进行排序,并按排序数组的第1个元素对结果进行排序。
select * from mytable
order by (sort(avals(attributes)::int[]))[1]
答案 1 :(得分:2)
如果你知道所有的元素,你可以像这样把它们拼凑起来:
ORDER BY greatest(my_table.hstore_fields -> 'a', my_table.hstore_fields -> 'b',my_table.hstore_fields -> 'c', my_table.hstore_fields -> 'd', my_table.hstore_fields -> 'e', my_table.hstore_fields -> 'f')
或
ORDER BY least(my_table.hstore_fields -> 'a', my_table.hstore_fields -> 'b',my_table.hstore_fields -> 'c', my_table.hstore_fields -> 'd', my_table.hstore_fields -> 'e', my_table.hstore_fields -> 'f')
答案 2 :(得分:0)
通过使用svals
,您可以创建hstore_col
值的分解版本 - 然后您可以对这些值进行排序并从每个值中获取第一个条目。毫无疑问,很多更有效的方法可以做到这一点,但这是第一次通过:
select my_table.id, my_table.hstore_col
from my_table
join (
select id, svals(hstore_col) as hstore_val
from my_table
) exploded_table
on my_table.id = exploded_table.id
group by my_table.id, my_table.hstore_col
order by my_table.id, exploded_table.hstore_val desc