带有 AND 运算符的 sqflite IN 运算符

sqflite IN operator with AND operator

我有以下查询,其中 select 来自员工 table,其中姓名为 "max",ID 不在 123 和 444 中。 不在 IDs 中可以在未来增长。但是我收到错误

错误

( 8023): [错误:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常: DatabaseException(靠近“?”: 语法错误 (代码 1 SQLITE_ERROR): , 编译时:

查询

     List<String> a = [];
        a.add("123");
        a.add("444");

        var table = await mydb.rawQuery(
            "SELECT value from employee  WHERE employeename = ? AND id NOT IN ? ORDER BY timestamp DESC",
            ["max", a]);

如果 LIST 不可预测,一种方法是您可以使用 JOIN 创建 select 语句,所需值为 NOT IN。下面是一个示例。

void main() {
  List<String> a = [];
  a.add("123");
  a.add("444");

  var select =
      'SELECT value from employee  WHERE employeename = ? AND id NOT IN (\'' +
          (a.join('\',\'')).toString() +
          '\') ORDER BY timestamp DESC';

  var table = await mydb.rawQuery(select, ["max"]);
}

如果你打印变量 select 你会得到

SELECT value from employee  WHERE employeename = ? AND id NOT IN ('123','444') 
ORDER BY timestamp DESC.

然后你可以将上面的语句传递给rawquery并得到你的结果。

P.S:相应地使用你的单引号和双引号。

我会选择@arun-palanisamy 的解决方案,请参阅 。道具交给他。我刚刚尝试了以下 - Groovy/Postgres,但错误似乎是一样的,所以你可能想试一试:

String[] a = ['123', '444']

// your code, throws 'ERROR: syntax error at or near ""':
// def table = sql.execute("SELECT value from employee WHERE employeename = ? AND id NOT IN ? ORDER BY timestamp DESC", ["max", a])

// code of arun-palanisamy, compiles:
def table = sql.execute("SELECT value from employee WHERE employeename = ? AND id NOT IN (${a.join(', ')}) ORDER BY timestamp DESC", ["max", a])

旁注:

  • 您可能想为 a 尝试不同的类型,例如我的代码中的 Array,甚至是 HashMap。
  • 有些示例(如 here)动态生成 ? 的数量。

更新:前往,我们同时发布