Как выполнить поиск элементов массива в столбце JSON без учета регистра?

Владислав Кузнецов
Владислав Кузнецов
  • Сообщений: 16
  • Последний визит: 20 января 2025 в 19:38

У меня есть ситуация, когда мы храним теги в массиве JSON, и клиент начал использовать его как хранилище значений ключа. Теперь мне нужно добавить способ поиска в этих данных без учета регистра.

Например, если столбец JSON содержит

{ "tags": ["Key1:value1", "Key2:value2"] } 

Как я могу успешно найти «Key1: VaLuE1» в массиве?

В настоящее время я запрашиваю это следующим образом, где

meta

это столбец JSON:

select * from events where "Key1:value1" member of (meta->"$.tags"); 

Я попробовал добавить

collate utf8mb4_general_ci
в обе стороны от условия, но это не работает. Я также попробовал сделать
LIKE

сравнение, но это не сработает, так как мне нужно убедиться, что оно извлекает только полную строку (например, не «Key1:val»). Я также хотел бы избежать изменения таблицы для изменения параметров сортировки для всего столбца JSON, но рассмотрю это, если это единственный вариант. 

Редактировалось: 3 раза (Последний: 20 января 2025 в 11:09)
Андрей Живов
Андрей Живов
  • Сообщений: 13
  • Последний визит: 20 января 2025 в 23:16

Вы можете решить проблему поиска без учета регистра в массиве JSON, одновременно гарантируя, что при сравнении строк проверяются точные совпадения (а не частичные совпадения), поэтому вы можете использовать комбинацию JSON_EXTRACT и LOWER. функций

попробуй это

SELECT *  FROM events  WHERE LOWER(JSON_UNQUOTE(JSON_EXTRACT(meta, '$.tags'))) = LOWER('Key1:VaLuE1'); 
Редактировалось: 1 раз (Последний: 20 января 2025 в 11:09)
Владислав Кузнецов
Владислав Кузнецов
  • Сообщений: 16
  • Последний визит: 20 января 2025 в 19:38

Я понял, что могу опустить только массив JSON, который я извлекал из столбца, вот так.

select * from events where lower("Key1:VaLuE1") member of(lower(meta->"$.tags")); 

Это работает отлично! Спасибо 

Редактировалось: 1 раз (Последний: 20 января 2025 в 11:11)
Авторизуйтесь, чтобы писать на форуме.

Заявка на услуги DST

Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.

Адрес

Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон