2014-10-27 52 views
3

任意属性,我喜欢这些记录的值:订单在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',但它并不适用于我的问题开展工作。

回答

4

转换为使用avals阵列,并投所得阵列从文本到整数。然后对数组进行排序并按排序数组的第一个元素排序结果。

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

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

+0

这是否意味着 ORDER BY最大(avals(属性):: INT []) 会还工作吗? – 2014-10-27 16:13:28

+0

@KirkRoybal它不会工作,因为'最大'返回其参数的最大值,并将数组视为单个参数 – FuzzyTree 2014-10-27 16:34:15

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 
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')