Дополнить findAndCountAll подстрокой и distinct несколькими столбцами

#postgresql #sequelize.js

#postgresql #sequelize.js

Вопрос:

Я пытаюсь выполнить операцию findAndCountAll в sequelize. Подсчет будет основан на комбинации из 3 разных столбцов. В одном из столбцов есть операция с подстрокой (столбец ресурсов)

Моя таблица Client выглядит следующим образом,

 id, clientId, accountId, resource
1,  4f16,     2b18,      table::res/123
2,  4f16,     2b18,      chair::res/123
  

Итак, я подсчитываю строки на основе идентификатора клиента, идентификатора учетной записи, идентификатора ресурса (строка после res / в столбце ресурсов). Итак, с приведенными выше записями я должен получить 1 в качестве count, поскольку ClientID, AccountId и resourceId одинаковы для обоих столбцов.

Мой простой запрос postgres

выберите distinct c.»AccountId», c.»ClientID», substring(«ресурс» из ‘res/([^$] )’) как «Идентификатор ресурса» из «Клиента» как c

Мой запрос sequelize теперь выглядит следующим образом, где нет distinct,

  const { rows, count} = await this.client.findAndCountAll({
  where: {
     clientId: clientId!
  },
  attributes: ['clientId', 'accountId',
    [fn('SUBSTRING', '"resource" from res/([^$] )'), 'resId'],
    [fn('COUNT', col('id')), 'totalResource']],
  group: ['clientId', 'accountId', 'resource'],
   raw: true
});
  

Я не уверен, как выполнить эту часть с подстрокой, а также выполнить distinct для 3 столбцов. С моим приведенным выше запросом я получаю «Ошибка sequelizedatabase: функция pg_catalog.substring (неизвестно) не существует

Ответ №1:

Удалось заставить это работать с помощью следующего кода:

  const { rows, count} = await this.client.findAndCountAll({
      where: {
         clientId: clientId!
      },
      attributes: [
        fn('DISTINCT', col('clientId'), col('accountId'),  [fn('substring', col('resource') , 'res/([^$] )'), 'resId']) ],
      group: ['clientId', 'accountId', 'resId'],
       raw: true
    });