2015-04-26 3 views
1

схемы:Сложные Postgres JSON порядок пунктом

TABLE field (
    field_id serial NOT NULL, 
    section_id integer, 
    title text, 
    type text, 
    default_val json, 
    rank integer, 
    tiny integer, 
    "values" json, 
    grp_id integer, 
    aggregate integer DEFAULT 1, 
    enabled integer, 
    deleted integer DEFAULT 0, 
    "desc" text 
) 

TABLE entry 
(
    entry_id serial NOT NULL, 
    section_id integer, 
    deleted integer DEFAULT 0, 
    grp_id integer, 
    data json, 
    last_edited bigint, 
    last_editor_id integer 
) 

Колонка field.values может выглядеть следующим образом: {0: {"rank" : 2, "title" : "asdf"}, 1: {"rank" : 1}}

Колонка entry.data может выглядеть следующим образом: {250: 1, 251: 0}

То, что я хотел бы запрос:

SELECT entry.* 
FROM entry 
LEFT JOIN field ON field.field_id = 31 
WHERE entry.deleted = 0 AND section_id = $1 AND grp_id = $2 
ORDER BY cast(field.values#>>'{**entry.data->>250**, rank}' as numeric) ASC 

Это это та часть, которую я не знаю, как это сделать: **entry.data->>250**

Возможно ли это? В основном я пытаюсь сортировать по значению ранга индекса в поле, которое соответствует записи.

EDIT:

покушений на:

(field.values->(cast(coalesce(e.data->>'f4', '0') as numeric)))->>'rank' 

Ошибка: оператор не существует: JSON -> Числовое

ответ

1

Вы не пытаетесь записать строку, которая, как некоторые устраняющее встроенные функции , Вы объединяете струны, чтобы построить более крупный ...

field.values#>>('{' || entry.data->>250 || ', rank}') 

Или, может быть, легче читать?

(field.values->(entry.data->>250))->>'rank' 
+0

Удивительная благодарность. Этот синтаксис, чтобы избежать строки, был всем, что я искал. Я просто выделил код, не пытаясь найти строку для этого или что-то в этом роде. – maxhud

+0

И не должно быть: '{|| entry.data - >> 250 || , rank} '? – maxhud

+1

Нет, это одна длинная строка, в отличие от трех строк, которые конкатенированы. В моем экзамене нет побегов, просто конкатенация – MatBailie