2016-12-09 3 views
1

Учитывая jsonb колонного типа и структуры данных, как это:Сортировка данных по "значению" из jsonb_each(), надежна?

{ "1": 10000.2, "2": 77.2, "3": -200.09, "4": 12.55 }

нужны получить результат от этого JSON и сортировать по VALUE

SELECT * FROM jsonb_each(
(SELECT jsonb_column FROM table WHERE id = 777) 
) 
ORDER BY VALUE DESC 
LIMIT 100 

Да, это дает правильный результат, но вопрос в том, как надежный заказывает jsonb тип? (т.к. VALUEjsonb type). Будет ли это работать правильно?

Я не хочу (если не нужен) явно обращенный: ORDER BY CAST(VALUE::TEXT AS NUMERIC), потому что в JSON, есть ~ 500 000 элементов и при преобразовании, требуется 2X время, чем сортировка просто VALUE

+0

Существует что-то подобное - http://stackoverflow.com/questions/25967778/order-by-json-data-type-postgres Вообще только правильное литье дает вам ожидается Результаты. – JosMac

+0

@JosMac Только из-за литья занимает больше времени, заинтересованный, если вы также можете использовать порядок jsonb. Если не 100% надежный, то я буду использовать правильное литье – RIKI

ответ

1

Если вы не» t смешивать типы данных для значений, которые ваш заказ, вы не нуждаетесь в литье, если вы это сделаете, оно будет заказано как documented.

Объект> Массив> Boolean> Number> Строка> Нуль

Объект с п пар> объект с п - 1 пар

массив с п элементов> массив с п - 1 элементов

так что если вы пытаетесь ваше заявление против такой: JSON

{ 
    "date": "2016-10-10", 
    "2": "-200.08", 
    "3": -200.09, 
    "some": "text", 
    "5":-200.08, 
    "mt":"-200.09", 
    "ar":[0,2] 
} 

Вы получаете заказ от выше:

t=# SELECT *,pg_typeof(value) FROM jsonb_each((select a from jt where i = 7)) order by value desc; 
key | value  | pg_typeof 
------+--------------+----------- 
ar | [0, 2]  | jsonb 
5 | -200.08  | jsonb 
3 | -200.09  | jsonb 
some | "text"  | jsonb 
date | "2016-10-10" | jsonb 
mt | "-200.09" | jsonb 
2 | "-200.08" | jsonb 
(7 rows)