powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка строки регулярным выражением
5 сообщений из 5, страница 1 из 1
Проверка строки регулярным выражением
    #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
Проверка строки регулярным выражением
    #39348948
execa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Названия object_global и array нам известны, на них можно завязываться.
...
Рейтинг: 0 / 0
Проверка строки регулярным выражением
    #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
Проверка строки регулярным выражением
    #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
Проверка строки регулярным выражением
    #39353727
execa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, решил проблему работой как с json
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка строки регулярным выражением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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