Запрос нечувствителен к регистру с Sequelize в Node, используя базу данных MariaDB - PullRequest
0 голосов
/ 10 июля 2019

Я новичок в Sequelize и после того, как много копаю, я не смог найти способ написать запрос, используя LOWER и LIKE одновременно.

Я хочу написать что-то вроде:

SELECT * 
  FROM acessories
 WHERE LOWER(name) LIKE '%xyz%' 
    OR LOWER(description) LIKE '%xyz%'
 ORDER BY name

Я написал такой код, но не могу использовать функцию LOWER:

const getAcessories = await Acessories.findAndCountAll({
        limit,
        offset: start,
        order: [["name", "ASC"]],
        where: {
          [Sequelize.Op.or]: [
            {
              name: {
                [Sequelize.Op.like]: `%${search}%`
              },
              description: {
                [Sequelize.Op.like]: `%${search}%`
              }
            }
          ]
        }
      });

Редактировать: Команда создания таблицы:

выберите * из atm_usuarios;

CREATE TABLE `acessories` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `store` int(11) NOT NULL,
  `in_value` decimal(10,2) NOT NULL,
  `out_value` decimal(10,2) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `description` varchar(500) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime DEFAULT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 collate=utf8_general_ci ROW_FORMAT=DYNAMIC;

Любая помощь?

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Предложение , где для вашего запроса можно записать в Sequelize.JS следующим образом:

const Utils = Sequelize.Utils;
const whereClause = {
    [Op.or]: [
        new Utils.Where(
            new Utils.Fn('LOWER', new Utils.Col('name')), {[Op.like]: `%${search}%`}
        ),
        new Utils.Where(
            new Utils.Fn('LOWER', new Utils.Col('description')), {[Op.like]: `%${search}%`}
        )
    ]
}

Если у вас есть экземпляр Sequelize, вы также можете написать это, используя статические методы, доступные для этого экземпляра, как:

const whereClause = {
    [Op.or]: [
        sequelize.where(
            sequelize.fn('LOWER', sequelize.col('name')), {[Op.like]: `%${search}%`}
        ),
        sequelize.where(
            sequelize.fn('LOWER', sequelize.col('description')), {[Op.like]: `%${search}%`}
        )
    ]
}

Это можно использовать так:

const getAcessories = await Acessories.findAndCountAll({
    limit,
    offset: start,
    order: [["name", "ASC"]],
    where: whereClause
});
0 голосов
/ 11 июля 2019

Может быть, вы можете использовать ILIKE? Вы можете просматривать документы и искать ILIKE: http://docs.sequelizejs.com/manual/querying.html

0 голосов
/ 10 июля 2019

Возможно, вам вообще не нужен LOWER.

Если COLLATION столбцов "нечувствительны к регистру", просто выполните тесты, не используя LOWER() или UPPER().

Чтобы увидеть параметры сортировки (и другие вещи), используйте SHOW CREATE TABLE.

Один из способов проверить это - попробовать с %xyz% и с %XYZ%.Я предсказываю, что оба будут давать вам одинаковые результаты, поэтому у вас будет сортировка без учета регистра.

Конкретно

Проблема с COLLATE utf8_bin в определении таблицы.

Ни одна из ссылок в комментариях не актуальна.Один относится к механизму «columnstore», который специально не используется для таблицы.Другой относится к именам «идентификаторов» - таким как имена таблиц и столбцов, а не содержимое столбцов.

...