You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart postgres包执行select语句抛出PostgreSQLSeverity.error 42601异常

Dart postgres包模糊匹配查询异常解决方案

异常根本原因

SQL语法本身不支持IN子句和LIKE模糊匹配直接组合使用,IN仅支持精确匹配固定值列表,和你的模糊查询需求逻辑不兼容。

可直接落地的实现方案

方案1:使用ANY关键字适配数组参数(推荐)

PostgreSQL原生支持LIKE ANY语法匹配数组内的所有模糊规则,Dart postgres包可直接传递列表作为数组参数,代码最简洁:

// 入参contacts为已添加%前缀的号码列表,示例:['%13800138000', '%13900139000']
Future<List<Map<String, dynamic>>> getMatchingContacts(List<String> contacts) async {
  final queryResult = await connection.query(
    "SELECT * FROM 你的表名 WHERE 电话号码列名 LIKE ANY(@contactList)",
    substitutionValues: {
      "contactList": contacts,
    },
  );
  return queryResult.toList();
}

方案2:动态拼接OR条件(兼容低版本PostgreSQL)

如果你的PostgreSQL版本不支持ANY语法,可以动态生成多个LIKE条件用OR拼接,全程参数化避免SQL注入:

Future<List<Map<String, dynamic>>> getMatchingContacts(List<String> contacts) async {
  // 生成对应数量的占位条件
  final likeConditions = List.generate(contacts.length, (index) => "电话号码列名 LIKE @p$index").join(" OR ");
  final sql = "SELECT * FROM 你的表名 WHERE $likeConditions";
  // 生成参数映射
  final params = Map.fromIterables(
    List.generate(contacts.length, (index) => "p$index"),
    contacts,
  );
  final queryResult = await connection.query(sql, substitutionValues: params);
  return queryResult.toList();
}

注意事项

  • 所有参数必须通过substitutionValues绑定,禁止直接拼接字符串到SQL语句中,避免SQL注入风险
  • 如果你需要前后都模糊匹配,给号码的首尾都添加%前缀和后缀即可
  • Dart postgres包会自动将Dart列表转换为PostgreSQL数组类型,无需手动处理格式转换

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:27:01