【问题标题】:Sequelize Where if not nullSequelize Where if not null
【发布时间】:2018-11-11 18:15:09
【问题描述】:

假设我想做一个选择命令

WHERE ID=2134

但是如果用户没有提供 ID,那么它不应该打扰 WHERE ID(因为它是空的)

如何使用 Sequelize 处理这个问题?

【问题讨论】:

  • 你必须在这里更清楚一点。你想发生什么?您要选择表格中的所有内容吗?是否要完全拒绝请求并强制用户提供 ID?
  • 检查是否存在用户输入并仅在存在查询选项时添加查询选项不是更实用吗?您可以为 queryOptions 创建一个变量,根据需要对其进行条件调整,然后将其直接传递给 Sequelize 查询,而不是将参数本身传递给查询语句。
  • @Asfgasdf 你找到解决办法了吗?

标签: javascript sql node.js express


【解决方案1】:

基本上你的查询应该有

WHERE fk_id=1234 OR fk_id is null

所以为了sequilize它会

const Op = Sequelize.Op;

Model.findAll({
   where: {
      fk_id: {
        [Op.or]: [1234, null]
      }
   }
});

这是文档: http://docs.sequelizejs.com/manual/tutorial/querying.html#operators

【讨论】:

  • 我不明白这有什么帮助。我的意思是,谁的表中有空 ID?
【解决方案2】:
Post.update({
  updatedAt: null,
}, {
  where: {
    deletedAt: {
      [Op.ne]: null
    }
  }
});

【讨论】:

  • 使用[Op.ne][Op.not]有区别吗?
  • 不确定,但我认为在 SQL 中 [Op.ne]![Op.not]NOT
【解决方案3】:

好的,我想我问错了这个问题。所以如果提供了id参数,当我们返回这个id过滤的结果时,如果不是返回所有结果。 像这样的

function getData(dataId) {
  let conditions = {};

  if (dataId) {
    conditions.where = { id: dataId };
  }

  return Model.findAll(conditions);
}

// The record with id = 1234
getData(1234).then(function(record) {
  // record readed here
});

// All records
getData().then(function(records) {
  // record readed here
});

【讨论】:

    【解决方案4】:

    我读了标题,上面写着,如果不为空的话。但是,我显示 IS NOT NULL 和 IS NULL

    我附上一个例子。

        const cars = await Car.findAll({
        where: {
            userId: {
                [Op.in]: myUserIds, // array like userId IN [2, 3, 4]
            },
            action: 'start', // like: action = 'start'
            sellDate: {
                [Op.not]: null, // Like: sellDate IS NOT NULL
            },
            status: {
                [Op.is]: null, // Like: status IS NULL
            }
        },
        order: [
            ['id', 'DESC'] // Like: ORDER BY id DESC
        ],
        limit: 5, 
        offset: 1
    });
    

    详情我附上文件 node_modules/sequelize/types/lib/operators.d.ts

    希望对你有帮助。

    /**
     * object that holds all operator symbols
     */
    declare const Op: {
      /**
       * Operator -|- (PG range is adjacent to operator)
       *
       * ```js
       * [Op.adjacent]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * -|- [1, 2)
       * ```
       */
      readonly adjacent: unique symbol;
      /**
       * Operator ALL
       *
       * ```js
       * [Op.gt]: {
       *  [Op.all]: literal('SELECT 1')
       * }
       * ```
       * In SQL
       * ```sql
       * > ALL (SELECT 1)
       * ```
       */
      readonly all: unique symbol;
      /**
       * Operator AND
       *
       * ```js
       * [Op.and]: {a: 5}
       * ```
       * In SQL
       * ```sql
       * AND (a = 5)
       * ```
       */
      readonly and: unique symbol;
      /**
       * Operator ANY ARRAY (PG only)
       *
       * ```js
       * [Op.any]: [2,3]
       * ```
       * In SQL
       * ```sql
       * ANY ARRAY[2, 3]::INTEGER
       * ```
       *
       * Operator LIKE ANY ARRAY (also works for iLike and notLike)
       *
       * ```js
       * [Op.like]: { [Op.any]: ['cat', 'hat']}
       * ```
       * In SQL
       * ```sql
       * LIKE ANY ARRAY['cat', 'hat']
       * ```
       */
      readonly any: unique symbol;
      /**
       * Operator BETWEEN
       *
       * ```js
       * [Op.between]: [6, 10]
       * ```
       * In SQL
       * ```sql
       * BETWEEN 6 AND 10
       * ```
       */
      readonly between: unique symbol;
      /**
       * With dialect specific column identifiers (PG in this example)
       *
       * ```js
       * [Op.col]: 'user.organization_id'
       * ```
       * In SQL
       * ```sql
       * = "user"."organization_id"
       * ```
       */
      readonly col: unique symbol;
      /**
       * Operator <@ (PG array contained by operator)
       *
       * ```js
       * [Op.contained]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * <@ [1, 2)
       * ```
       */
      readonly contained: unique symbol;
      /**
       * Operator @> (PG array contains operator)
       *
       * ```js
       * [Op.contains]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * @> [1, 2)
       * ```
       */
      readonly contains: unique symbol;
      /**
       * Operator LIKE
       *
       * ```js
       * [Op.endsWith]: 'hat'
       * ```
       * In SQL
       * ```sql
       * LIKE '%hat'
       * ```
       */
      readonly endsWith: unique symbol;
      /**
       * Operator =
       *
       * ```js
       * [Op.eq]: 3
       * ```
       * In SQL
       * ```sql
       * = 3
       * ```
       */
      readonly eq: unique symbol;
      /**
       * Operator >
       *
       * ```js
       * [Op.gt]: 6
       * ```
       * In SQL
       * ```sql
       * > 6
       * ```
       */
      readonly gt: unique symbol;
      /**
       * Operator >=
       *
       * ```js
       * [Op.gte]: 6
       * ```
       * In SQL
       * ```sql
       * >= 6
       * ```
       */
      readonly gte: unique symbol;
    
      /**
       * Operator ILIKE (case insensitive) (PG only)
       *
       * ```js
       * [Op.iLike]: '%hat'
       * ```
       * In SQL
       * ```sql
       * ILIKE '%hat'
       * ```
       */
      readonly iLike: unique symbol;
      /**
       * Operator IN
       *
       * ```js
       * [Op.in]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * IN [1, 2]
       * ```
       */
      readonly in: unique symbol;
      /**
       * Operator ~* (PG only)
       *
       * ```js
       * [Op.iRegexp]: '^[h|a|t]'
       * ```
       * In SQL
       * ```sql
       * ~* '^[h|a|t]'
       * ```
       */
      readonly iRegexp: unique symbol;
      /**
       * Operator IS
       *
       * ```js
       * [Op.is]: null
       * ```
       * In SQL
       * ```sql
       * IS null
       * ```
       */
      readonly is: unique symbol;
      /**
       * Operator LIKE
       *
       * ```js
       * [Op.like]: '%hat'
       * ```
       * In SQL
       * ```sql
       * LIKE '%hat'
       * ```
       */
      readonly like: unique symbol;
      /**
       * Operator <
       *
       * ```js
       * [Op.lt]: 10
       * ```
       * In SQL
       * ```sql
       * < 10
       * ```
       */
      readonly lt: unique symbol;
      /**
       * Operator <=
       *
       * ```js
       * [Op.lte]: 10
       * ```
       * In SQL
       * ```sql
       * <= 10
       * ```
       */
      readonly lte: unique symbol;
      /**
       * Operator !=
       *
       * ```js
       * [Op.ne]: 20
       * ```
       * In SQL
       * ```sql
       * != 20
       * ```
       */
      readonly ne: unique symbol;
      /**
       * Operator &> (PG range does not extend to the left of operator)
       *
       * ```js
       * [Op.noExtendLeft]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * &> [1, 2)
       * ```
       */
      readonly noExtendLeft: unique symbol;
      /**
       * Operator &< (PG range does not extend to the right of operator)
       *
       * ```js
       * [Op.noExtendRight]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * &< [1, 2)
       * ```
       */
      readonly noExtendRight: unique symbol;
      /**
       * Operator NOT
       *
       * ```js
       * [Op.not]: true
       * ```
       * In SQL
       * ```sql
       * IS NOT TRUE
       * ```
       */
      readonly not: unique symbol;
      /**
       * Operator NOT BETWEEN
       *
       * ```js
       * [Op.notBetween]: [11, 15]
       * ```
       * In SQL
       * ```sql
       * NOT BETWEEN 11 AND 15
       * ```
       */
      readonly notBetween: unique symbol;
      /**
       * Operator NOT ILIKE (case insensitive) (PG only)
       *
       * ```js
       * [Op.notILike]: '%hat'
       * ```
       * In SQL
       * ```sql
       * NOT ILIKE '%hat'
       * ```
       */
      readonly notILike: unique symbol;
      /**
       * Operator NOT IN
       *
       * ```js
       * [Op.notIn]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * NOT IN [1, 2]
       * ```
       */
      readonly notIn: unique symbol;
      /**
       * Operator !~* (PG only)
       *
       * ```js
       * [Op.notIRegexp]: '^[h|a|t]'
       * ```
       * In SQL
       * ```sql
       * !~* '^[h|a|t]'
       * ```
       */
      readonly notIRegexp: unique symbol;
      /**
       * Operator NOT LIKE
       *
       * ```js
       * [Op.notLike]: '%hat'
       * ```
       * In SQL
       * ```sql
       * NOT LIKE '%hat'
       * ```
       */
      readonly notLike: unique symbol;
      /**
       * Operator NOT REGEXP (MySQL/PG only)
       *
       * ```js
       * [Op.notRegexp]: '^[h|a|t]'
       * ```
       * In SQL
       * ```sql
       * NOT REGEXP/!~ '^[h|a|t]'
       * ```
       */
      readonly notRegexp: unique symbol;
      /**
       * Operator OR
       *
       * ```js
       * [Op.or]: [{a: 5}, {a: 6}]
       * ```
       * In SQL
       * ```sql
       * (a = 5 OR a = 6)
       * ```
       */
      readonly or: unique symbol;
      /**
       * Operator && (PG array overlap operator)
       *
       * ```js
       * [Op.overlap]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * && [1, 2)
       * ```
       */
      readonly overlap: unique symbol;
      /**
       * Internal placeholder 
       *
       * ```js
       * [Op.placeholder]: true
       * ```
       */
      readonly placeholder: unique symbol;
      /**
       * Operator REGEXP (MySQL/PG only)
       *
       * ```js
       * [Op.regexp]: '^[h|a|t]'
       * ```
       * In SQL
       * ```sql
       * REGEXP/~ '^[h|a|t]'
       * ```
       */
      readonly regexp: unique symbol;
      /**
       * Operator LIKE
       *
       * ```js
       * [Op.startsWith]: 'hat'
       * ```
       * In SQL
       * ```sql
       * LIKE 'hat%'
       * ```
       */
      readonly startsWith: unique symbol;
      /**
       * Operator << (PG range strictly left of operator)
       *
       * ```js
       * [Op.strictLeft]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * << [1, 2)
       * ```
       */
      readonly strictLeft: unique symbol;
      /**
       * Operator >> (PG range strictly right of operator)
       *
       * ```js
       * [Op.strictRight]: [1, 2]
       * ```
       * In SQL
       * ```sql
       * >> [1, 2)
       * ```
       */
      readonly strictRight: unique symbol;
      /**
       * Operator LIKE
       *
       * ```js
       * [Op.substring]: 'hat'
       * ```
       * In SQL
       * ```sql
       * LIKE '%hat%'
       * ```
       */
      readonly substring: unique symbol;
      /**
       * Operator VALUES
       * 
       * ```js
       * [Op.values]: [4, 5, 6]
       * ```
       * In SQL
       * ```sql
       * VALUES (4), (5), (6)
       * ```
       */
      readonly values: unique symbol;
    };
    
    export = Op;

    【讨论】:

      【解决方案5】:

      let where = {}
      
      if (req.query.id) {
        where = {
          id: req.query.id
        }
      }
      
      Model.findAll({
        where: where
      });

      【讨论】:

        猜你喜欢
        • 2015-10-02
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-08
        相关资源
        最近更新 更多