【问题标题】:sqflite IN operator with AND operatorsqflite IN 运算符与 AND 运算符
【发布时间】:2019-12-09 16:14:19
【问题描述】:

我有以下查询,该查询从员工表中选择,其中名称为“max”且 ID 不在 123 和 444 中。 不在 ID 中可以在未来增长。但我收到错误

错误

( 8023): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:DatabaseException(near "?": syntax error (code 1 SQLITE_ERROR): , while compile:

查询

     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]);

【问题讨论】:

  • 这是在颤振中,使用 Dart 语言。
  • 是的,我明白了。 LIST 的值是否固定?我的意思是它总是2?如果是这样,一种方法是参数 (?) 不应该匹配任何值。类似..NOT IN (?,?) ... 并将值放入whereArgs: a 或者您必须将这些值与,..类似id IN (${a.join(', ')}) 的东西连接起来
  • 值列表将发生变化,现在是 2,但将来可能是 5 、 6。取决于场景

标签: flutter dart sqflite


【解决方案1】:

如果LIST 不可预测,一种方法是您可以使用JOIN 来创建所需值为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 value from employee  WHERE employeename = ? AND id NOT IN ('123','444') 
ORDER BY timestamp DESC.

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

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

【讨论】:

  • 解决方案有效。这是专业水平。因此我可以优化代码。
  • 如果您的任何 SQL 是通过在运行时生成字符串来完成的,那么您只是在请求 Bobby Tables SQL 注入攻击。请不要那样做。这就是占位符的用途! bobby-tables.com
  • @Randal Schwartz,我同意,这段代码容易发生 SQL 注入。我试图解决 OP 的现有问题。我将在答案中加一句警告,并尝试提供一个替代查询来避免 SQL 注入。
  • 这只是要求进行 SQL 注入。不要这样做!!!!!!!!!
【解决方案2】:

我会选择 @arun-palanisam 的解决方案,请参阅 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,我们同时发布

【讨论】:

  • 这是一种可能的 SQL 注入攻击。不要这样做。使用占位符。不要在运行时从程序数据生成 SQL。 bobby-tables.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多