代码之家  ›  专栏  ›  技术社区  ›  Zayco

动态向sequenceize.js查询添加属性

  •  1
  • Zayco  · 技术社区  · 7 年前

    我有一个查询,其多个属性如下所示。

    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生成的查询如下所示。

    选择count(case when convert(date,[field1])between'2018-01-01'and'2018-01-31'then 1 else null end)作为[jan], 将'2018-02-01'和'2018-02-28'之间的(日期,[field1])转换为[feb], 将'2018-03-01'和'2018-03-31'之间的(日期,[field1])转换为[mar] 从[dbo].[table1]作为[table1],其中[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(转换时的大小写(日期,[field1])介于'2018-01-01'和'2018-01-31'之间,然后是1个空结尾)\”},\“jan\”],[{“val\”:\“count(转换时的大小写(日期,[field1]),介于'2018-02-01'和'2018-02-28'之间,然后是1个空结尾)\”},\“feb\”,[{“val\”:\“count(转换时的大小写(日期,[field1])在'2018-03-01'和'2018-03-31'之间,则1 else null end)\“},\”mar\“]]不是有效的属性定义。请使用以下格式:[“属性定义”,“别名”]

    所以它创建了一个正确的查询,但是有很多axtra符号。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Zayco    7 年前

    我通过将属性声明为查询外部的空数组,然后将每个属性都推送到查询中,使其正常工作。

    const attributesPvCompletedByMonth = [];
    

    map函数:

    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,
    };
    
    推荐文章