带AND运算符的sqflite IN运算符

时间:2019-12-06 14:59:33

标签: flutter dart sqflite

我有以下查询,该查询从名称为“ max”且ID不在123和444中的雇员表中选择。 没有ID的人将来可能会增长。但我收到错误

错误

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

查询

exit

2 个答案:

答案 0 :(得分:4)

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

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 value from employee  WHERE employeename = ? AND id NOT IN ('123','444') 
ORDER BY timestamp DESC.

然后,您可以将以上语句传递给rawquery并获得结果。

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

答案 1 :(得分:2)

我将寻求@ arun-palanisamy的解决方案,请参阅his comment。道具去给他。我只是尝试使用Groovy / Postgres进行以下操作,但是错误似乎相同,因此您可能需要尝试一下:

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

// your code, throws 'ERROR: syntax error at or near "$2"':
// 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)是动态生成?数量的。

更新:去this answer,我们同时发布了