Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка строки регулярным выражением / 5 сообщений из 5, страница 1 из 1
17.11.2016, 11:54
    #39348945
execa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка строки регулярным выражением
Всем доброго времени суток. Буду рад если вы поможете продвинуться в проблеме.

В БД в одном из полей хранится json-строка, назовем ее s. Такого вида:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
{
  "key_1": [
    {
      "object_global": {
        "field_1": "field_1",
        "field_n": "field_n"
      },
      "array": [
        {
          "id": id_value,
          "field_1": "field_1",
          "field_n": "field_n"
        }
      ]
    }
  ],
  "key_n": [
    {
      "object_global": {
        "field_1": "field_1",
        "field_n": "field_n"
      },
      "array": [
        {
          "id": id_value,
          "field_1": "field_1",
          "field_n": "field_n"
        },
        {
          "id": id_value,
          "field_1": "field_1",
          "field_n": "field_n"
        }
      ]
    }
  ]
}


На входе у нас есть ключ (key), и id_value объекта в массиве(array). Особенности массива: ключ заявлен как массив, но там будет всегда один объект, ключ завершается символом ]. Ключей может быть много, в каждом ключе object_global и array только 1. Json-строка хранится без пробелов и переносов строк (это я для удобочитаемости).

Необходимо определить регулярным выражением, что для данного ключа, в массиве есть объект с данным id_value, или нет такого объекта.

Вот такая конструкция - s ILIKE concat('%', 'key', '%:', 'id_value', ',%') - перескакивает на массивы для других ключей, а мне хотелось ограничить поиск массивами конкретного ключа.

Заранее благодарю за любую помощь.
...
Рейтинг: 0 / 0
17.11.2016, 11:56
    #39348948
execa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка строки регулярным выражением
Названия object_global и array нам известны, на них можно завязываться.
...
Рейтинг: 0 / 0
18.11.2016, 11:14
    #39349694
Alex__kK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка строки регулярным выражением
execa,

А может с json работать как с json а не как со строкой?

Типа как то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
select count(*)
from (
       select json_array_elements(json_array_elements('{
  "key_1": [
    {
      "object_global": {
        "field_1": "field_1",
        "field_n": "field_n"
      },
      "array": [
        {
          "id": 1,
          "field_1": "field_1",
          "field_n": "field_n"
        }
      ]
    }
  ],
  "key_n": [
    {
      "object_global": {
        "field_1": "field_1",
        "field_n": "field_n"
      },
      "array": [
        {
          "id": 2,
          "field_1": "field_1",
          "field_n": "field_n"
        },
        {
          "id": 3,
          "field_1": "field_1",
          "field_n": "field_n"
        }
      ]
    }
  ]
}'::json -> 'key_1') -> 'array') -> 'id' id
     ) as sq1
where id::text::integer = 1


Это в лоб, просто идея, а так допилить.
Соответственно в запросе 'key_1' - это элемент в котором ищем и 1 - значение которое ищем
...
Рейтинг: 0 / 0
21.11.2016, 11:24
    #39350850
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка строки регулярным выражением
execa, попробуйте jsquery расширение для работы с jsonb
jsquery
там есть необходимые вам операторы: проверять что объект является массивом, содержит ключ и тд

мое примерное решение, только не проверял на запуск: проверяем, что ключ ИД в вложенном массиве в ключ key_1 является numeric (так возмжоно но не факт отсекутся NULL значения что равносильно отсутствию элемента)

Код: sql
1.
where ваш_json::jsonb @@ 'key_1.#:(id is numeric)'::jsquery 


если у вас это получится то работать должно быстрее, при условии наличия GIN индекса, и использования jsonb вместо json
...
Рейтинг: 0 / 0
24.11.2016, 14:59
    #39353727
execa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка строки регулярным выражением
Всем спасибо, решил проблему работой как с json
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка строки регулярным выражением / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]