MySQL / Sequelize — как выполнить запрос для получения данных, поле которых является пустым массивом

#mysql #sql #orm #sequelize.js

#mysql #sql #orm #sequelize.js

Вопрос:

Мой http-запрос вернет данные ниже:
он возвращает данные ниже:

Users.js

 {
    {
       ...
       friends:[]
    },
    {
       ...
       friends:[{id:xxx,...},...]
    },
    {
       ...
       friends:[]
    },
}
  

Если я хочу использовать запрос для получения всех данных, массив друзей которых равен [],
я должен выполнить запрос ниже.
выберите * из пользователей, где (что я должен написать здесь)

Ответ №1:

Если friends прямой столбец в вашей базе данных — это JSON массив. Вы можете использовать JSON_LENGTH , чтобы узнать длину массива.

 SELECT JSON_LENGTH('[1, 2, {"a": 3}]'); // Output: 3
SELECT JSON_LENGTH('[]'); // Output: 0
  

Вы можете использовать ту же концепцию для получения данных из вашей базы данных.

 select * 
FROM users 
WHERE JSON_LENGTH(friends) = 0;
  

Если вы вложили JSON и один из ключей находится friends в этом json для данного столбца ( data ), тогда ваш запрос будет похож на использование JSON_CONTAINS

 SELECT * 
FROM users
WHERE JSON_CONTAINS(data, JSON_ARRAY(), '$.friends') -- To check do we have `friends` as key in that json
  and JSON_LENGTH(data, '$.friends') = 0;  -- To check whether it is empty array.
  

Теперь вы можете преобразовать его в запрос sequelize. Один из способов, который вы можете использовать, это

 Model.findAll({
   where: {
       [Op.and]: [
           Sequelize.literal('RAW SQL STATEMENT WHICH WONT BE ESCAPED!!!')
       ]
   }
})
  

Обязательно обновите Model свою user модель и запрос.