|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
В базе есть записи id : 3024 data : ["Егор","[{\"text\":\" Центральноафриканская Республика CAF \",\"value\":\"2696\"}]"] id : 3025 data : ["Олег","[{\"text\":\" Египет \",\"value\":\"3341\"}]"] Как сделать запрос, чтобы выбрать только записи со значением value 2696 (Центральноафриканская Республика) которые находятся внутри JSON записи поля data? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 17:01 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
manking, Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 17:07 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
Alex URSmanking, Код: plsql 1. 2. 3. 4. 5. 6. 7.
Пишет Ошибка SQL: ОШИБКА: неверный синтаксис для типа json LINE 6: WHERE value = 'value' ^ DETAIL: Ошибочный элемент текста "value". CONTEXT: данные JSON, строка 1: value В операторе: SELECT id, json_data.* FROM directories_data , jsonb_each(directories_data.data::jsonb) AS json_data WHERE value = 'value' AND key = 2696 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 17:16 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
manking, думал догадаешься... у тебя же json :[array json] Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 19:06 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
mankingВ базе есть записи id : 3024 data : ["Егор","[{\"text\":\" Центральноафриканская Республика CAF \",\"value\":\"2696\"}]"] id : 3025 data : ["Олег","[{\"text\":\" Египет \",\"value\":\"3341\"}]"] Как сделать запрос, чтобы выбрать только записи со значением value 2696 (Центральноафриканская Республика) которые находятся внутри JSON записи поля data? https://github.com/postgrespro/jsquery/ - модуль позволяет SQL искать ВНУТРИ JSONB без него будете строчить запросы на весь экран а с ним просто: Код: sql 1.
обычный jsonb не умеет дальше ключа эффективно искать ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 19:35 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
но вообще разрабы советуют отдельные колонки делать, если нужен поиск по ним ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 19:36 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
mankingобычный jsonb не умеет дальше ключа эффективно искать можно мне по подробнее, что Вы имеете в виду? PS за jsquery спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 19:58 |
|
Условие WHERE внутри JSON поля postgresql?
|
|||
---|---|---|---|
#18+
GIN умеет: @>, ?, ?& and ?| запрос должен быть по верхним ключам дерева Can query nested objects, but only in paths rooted at the top level . в вашем случае это: id, data авторThe non-default GIN operator class jsonb_path_ops supports indexing the @> operator only. An example of creating an index with this operator class is: # !!! такой индекс умеет только @>, но он быстрее и меньше, чем стандартный jsonb_ops Код: sql 1.
Рассмотрим пример таблицы, в которой хранятся документы JSON, получаемые от сторонней веб-службы, с документированным определением схемы. Типичный документ: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Мы сохраняем эти документы в таблице api, в столбце jdoc типа jsonb. Если по этому столбцу создаётся GIN-индекс, он может применяться в подобных запросах: -- Найти документы, в которых ключ "company" имеет значение "Magnafone" Код: sql 1.
Однако, в следующих запросах он не будет использоваться, потому что, несмотря на то, что оператор ? — индексируемый, он применяется не к индексированному столбцу jdoc непосредственно: -- Найти документы, в которых ключ "tags" содержит ключ или элемент массива "qui" Код: sql 1.
И всё же, правильно применяя индексы выражений, в этом запросе можно задействовать индекс. Если запрос определённых элементов в ключе "tags" выполняется часто, вероятно стоит определить. такой индекс: Код: sql 1.
-- Теперь предложение WHERE jdoc -> 'tags' ? 'qui' будет выполняться как применение индексируемого оператора ? к индексируемому выражению jdoc -> 'tags'. Ещё один подход к использованию проверок на существование: -- Найти документы, в которых ключ "tags" содержит элемент массива "qui" Код: sql 1.
Этот запрос может задействовать простой GIN-индекс по столбцу jdoc. Но заметьте, что такой индекс будет хранить копии всех ключей и значений в поле jdoc, тогда как индекс выражения из. предыдущего примера хранит только данные внутри объекта с ключом tags. Хотя подход с простым индексом гораздо более гибкий (так как он поддерживает запросы по любому ключу), индексы. конкретных выражений скорее всего будут меньше и быстрее, чем простые индексы. https://postgrespro.ru/docs/postgresql/10/datatype-json ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2018, 23:42 |
|
|
start [/forum/topic.php?fid=53&msg=39641664&tid=1995784]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 150ms |
0 / 0 |