按hstore中任意属性的值排序

时间:2014-10-27 15:38:24

标签: sql postgresql hstore

我有这样的记录:

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',但它对我的问题不起作用。

3 个答案:

答案 0 :(得分:4)

使用avals转换为数组,并将结果数组从文本转换为整数。然后对数组进行排序,并按排序数组的第1个元素对结果进行排序。

select * from mytable
order by (sort(avals(attributes)::int[]))[1]

http://sqlfiddle.com/#!15/84f31/5

答案 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