E1ON
@E1ON
web, gamedev, anime, science

Запрос в БД. Как составить условие по «массиву»?

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

Нужно как то взять первый элемент массива и сделать по нему условие по типу больше чем, меньше чем.
Есть предложения?
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
E1ON
@E1ON Автор вопроса
web, gamedev, anime, science
Решение:
SELECT * FROM table WHERE CAST(JSON_VALUE(col, '$[0]') AS CHAR(22)) > 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Предложение есть: не хранить массивы в виде текста. Вынести их в отдельную таблицу, или хотя-бы в json (если ваша СУБД умеет с ним работать).

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

К этому можно придти даже логическим путём:
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)

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

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

Войти через центр авторизации
Похожие вопросы
21 янв. 2021, в 15:03
10000 руб./за проект
21 янв. 2021, в 14:45
3000 руб./за проект
21 янв. 2021, в 14:41
8000 руб./за проект