【问题标题】:Dynamically add attributes to sequelize.js query为 sequelize.js 查询动态添加属性
【发布时间】:2018-12-08 22:26:52
【问题描述】:

我有一个带有多个属性的查询,看起来像这样。

const queryPvCompletedByMonth = {
    attributes: [
      [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(0).startDate}' AND '${
            getFirstAndLastDayInMonth(0).endDate
          }' THEN 1 ELSE NULL END)`
        ),
        'Jan',
      ],
      [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(1).startDate}' AND '${
            getFirstAndLastDayInMonth(1).endDate
          }' THEN 1 ELSE NULL END)`
        ),
        'Feb',
      ],
      [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(2).startDate}' AND '${
            getFirstAndLastDayInMonth(2).endDate
          }' THEN 1 ELSE NULL END)`
        ),
        'Mar',
      ],
    ],
    where: {
      Field2: 2,
    },
    raw: false,
  };

等等所有的月份。这行得通,我从查询中得到了预期的结果。

sequelize 生成的查询如下所示。

SELECT COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-01-01' AND '2018-01-31' THEN 1 ELSE NULL END) AS [Jan], 计数(转换时的案例(日期,[Field1])在“2018-02-01”和“2018-02-28”之间,然后 1 ELSE NULL END)作为 [2 月], 计数(转换时的案例(日期,[Field1])在“2018-03-01”和“2018-03-31”之间,然后 1 ELSE NULL END)作为 [Mar] FROM [dbo].[Table1] AS [table1] WHERE [table1].[field2] = 2;

我想动态插入它们,而不是拥有 12 个硬编码属性。所以我把所有的月份都放在一个这样的数组中。

const months = [
  { index: 0, name: 'Jan' },
  { index: 1, name: 'Feb' },
  { index: 2, name: 'Mar' },
  { index: 3, name: 'Apr' },
  { index: 4, name: 'May' },
  { index: 5, name: 'Jun' },
  { index: 6, name: 'Jul' },
  { index: 7, name: 'Aug' },
  { index: 8, name: 'Sep' },
  { index: 9, name: 'Oct' },
  { index: 10, name: 'Nov' },
  { index: 11, name: 'Dec' },
];

并试图通过列表映射以返回这样的属性。

const queryPvCompletedByMonth = {
    attributes: [
      months.map(m => [
        Sequelize.literal(
          `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${
            getFirstAndLastDayInMonth(m.index).startDate
          }' AND '${getFirstAndLastDayInMonth(m.index).endDate}' THEN 1 ELSE NULL END)`
        ),
        m.name,
      ]),
    ],
    where: {
      AOTyp: 2,
    },
    raw: false,
  };

这给了我一个续集的错误

[[{\"val\":\"COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-01-01' AND '2018-01-31' THEN 1 ELSE NULL END)\" },\"Jan\"],[{\"val\":\"COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-02-01' AND '2018-02-28' THEN 1 ELSE NULL END)\"},\"Feb\"],[{\"val\":\"COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-03-01' AND '2018-03- 31' THEN 1 ELSE NULL END)\"},\"Mar\"]] 不是有效的属性定义。请使用以下格式:['属性定义', '别名']

所以它有点创建正确的查询,但有很多额外的符号。

所以我的问题是,有没有办法做到这一点?

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    我通过在查询之外将属性声明为空数组然后将每个属性推入其中来实现它。

    const attributesPvCompletedByMonth = [];
    

    地图功能:

    const generateAttributesForPvCompletedMyMonths = () => {
      months.map(m => {
        const attribute = [
          Sequelize.literal(
            `COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${
              getFirstAndLastDayInMonth(m.index).startDate
            }' AND '${getFirstAndLastDayInMonth(m.index).endDate}' THEN 1 ELSE NULL END)`
          ),
          m.name,
        ];
        return attributesPvCompletedByMonth.push(attribute);
      });
    };
    

    查询

    const queryPvCompletedByMonth = {
      attributes: attributesPvCompletedByMonth,
      where: {
        Field2: 2,
      },
      raw: true,
    };
    

    【讨论】:

      猜你喜欢
      • 2022-07-13
      • 2014-03-02
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      相关资源
      最近更新 更多