2014-10-27 72 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')