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

Go语言SQL查询中通配符的正确使用及报错解决

错误原因
  • SQL语法错误1:初始查询语句没有WHERE子句,直接拼接AND p.name LIKE ...会导致SQL结构非法
  • SQL语法错误2:LIKE %:name写法不符合规范,通配符%需要作为匹配字符串的一部分,不能直接跟在LIKE关键字后,同时会导致驱动无法识别:name命名参数
正确实现方案

推荐优先在参数绑定时拼接通配符,兼容性最强、安全性最高,避免不同数据库的函数差异:

  1. 修正SQL构造逻辑:
// 末尾加WHERE 1=1 兼容后续动态拼接的AND条件
query := "select p.project_id,p.name,p.org_id,p.user_id,p.email,p.status_ind,p.approver,p.favorite,p.create_timestamp,t.name as tagname,count(b.name) as total,t.colorCode from project p inner join tag t on p.project_id = t.project_id WHERE 1=1 "
q2 := " left join build b on p.project_id = b.project_id AND b.status_ind = \"created\" AND p.status_ind = :status group by p.project_id, t.colorCode "
if q["name"] != "" {
    // 移除直接写在SQL里的%,只保留命名占位符
    query += " AND p.name LIKE :name " 
}
query += q2
query += " ORDER BY create_timestamp DESC "
query += " LIMIT :limit;"
  1. 绑定参数时拼接通配符:
// 示例为命名参数传参逻辑,根据你使用的ORM/数据库驱动调整即可
params := map[string]interface{}{
    "status": 你的status参数值,
    "limit":  你的分页限制值,
}
if q["name"] != "" {
    // 前后加%实现模糊匹配,只需要前缀/后缀匹配的话可以只加一边
    params["name"] = "%" + q["name"] + "%"
}
// 执行查询时传入params即可

如果需要在SQL层面拼接通配符,可以使用数据库内置的CONCAT函数,适合不需要修改参数绑定逻辑的场景:

if q["name"] != "" {
    query += " AND p.name LIKE CONCAT('%', :name, '%') " 
}
注意事项
  • 不要直接将用户输入的q["name"]字符串拼接到SQL语句中,必须使用参数绑定避免SQL注入风险
  • 如果使用的是?占位符的驱动,替换:name为?即可,逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:27:02