我有一个简单的查询,如下所示。
select json_agg(row_to_json(t)) from (select *
from jobs, companies, locations
where jobs.company_id = companies.id and jobs.location_id = locations.id
$extra
and to_tsvector(jobs.name || ' ' || companies.name || ' ' || locations.name) @@ to_tsquery($1)
and to_tsvector(locations.name) @@ to_tsquery($2)
limit $3) t
但它在附加查询方面存在一些问题。 $1
和 $2
参数根据查询用户请求是可选的。但是,至少在这种情况下 to_tsquery
(postgresql) 不支持任何像 '*' 这样的“全部匹配”查询,所以我们必须有整个附加查询 和 to_tsvector(locations.name ) @@ to_tsquery($2)
使用正确的参数或根本不使用。
这使得基于参数构建查询变得很烦人,因为我们必须一直复制相同的查询并添加额外的查询,而且很容易累加。我有一个解决方案,使用 strings.Replace
来添加额外的查询,但如果需要,我们仍然需要转义参数。有没有其他解决方案可以干净地完成这项工作?
最佳答案
这里是一个棘手的解决方案,希望能对你有所帮助。此查询示例使用 github.com/lib/pq 的语法查询
baseQuery := `
SELECT *
FROM
tableName
WHERE
(name ILIKE $1)`
params := []interface{}{"%" + nameLike + "%"}
// you can add optional criteria using this way
if condition==true {
baseQuery += fmt.Sprintf(` AND student_no=$%d`, len(params)+1)
params = append(params, studentNo)
}
filterQuery := baseQuery + ` ORDER BY contract_no ASC`
if totalLimit != 0 {
filterQuery += fmt.Sprintf(` LIMIT $%d OFFSET $%d`, len(params)+1, len(params)+2)
params = append(params, totalLimit, totalSkip)
}
rows, err := db.Query(filterQuery, params...)
关于sql - 在go中参数化sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619422/