схемы:Сложные 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 -> Числовое
Удивительная благодарность. Этот синтаксис, чтобы избежать строки, был всем, что я искал. Я просто выделил код, не пытаясь найти строку для этого или что-то в этом роде. – maxhud
И не должно быть: '{|| entry.data - >> 250 || , rank} '? – maxhud
Нет, это одна длинная строка, в отличие от трех строк, которые конкатенированы. В моем экзамене нет побегов, просто конкатенация – MatBailie