Задать вопрос
E1ON
@E1ON
Programming, Gamedev, VR

Как составить условие по «массиву»?

Есть поле в БД в котором хранится json, тип поля longtext.
Информация хранится в таком виде:
["1", "2", "3"]

Нужно как то взять первый элемент массива и сделать по нему условие.
  • Вопрос задан
  • 916 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
E1ON
@E1ON Автор вопроса
Programming, Gamedev, VR
Решение:
SELECT * FROM `table` WHERE JSON_VALUE(`col`, '$[0]') > 1;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Предложение есть: не хранить массивы в виде текста. Вынести их в отдельную таблицу, или хотя-бы в json (если ваша СУБД умеет с ним работать).

Еще есть предложение почитать учебник по базам данных, где про нормальные формы, индексы, и т.д. Но вы же и так в курсе, правда?
Ответ написан
> Сделать условие по первой строке с числом в сериализованном массиве внутри строки
Коротко: Нельзя. А вернее можно, но это придётся делать через хранимые процедуры и ни на какие кэши это не ляжет. И вообще так делать нельзя по этическим соображениям.

К этому можно придти даже логическим путём:
1. База данных воспринимает этот "массив", как строку. Значит надо как-то распрасить этот массив - Пусть будет волшебная хранимая процедура PARSE_ARRAY(str), которая вернёт нам новую табличку с элементами массива
2. В массиве хрянятся СТРОКИ, а не числа. значит нам надо их тоже спарсить - к счатью во многих СУБД есть такие функции из коробки. Что за СУБД используется не сказано, так что пусть будет PARSE_INT(str), которая вернёт там число.
Тогда запрос будет выглядеть как-то так:
SELECT * from table_name t
where (SELECT PARSE_INT(value) > 1 FROM PARSE_ARRAY(t.array) a LIMIT 1)

Но повторюсь, что так делать нельзя - в большинстве реляционных баз данных нет понятия "массив", и оно будет очень сильно тормозить
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы