如何在Golang的squirrel库中使用PostgreSQL的DISTINCT ON
解决squirrel v1.5.2中实现DISTINCT ON的问题
因为squirrel v1.5.2没有提供专门的DistinctOn方法,你可以通过直接在Select方法中嵌入原生SQL片段的方式生成目标语句,具体有两种常用方式:
1. 直接写死DISTINCT ON子句
如果分组列是固定的,直接将distinct on (name, age)作为SELECT子句的一部分传入:
sql, args, err := squirrel.Select("distinct on (name, age) name, age, city"). From("people"). Where(squirrel.Eq{"name": "John"}). ToSql()
执行后生成的SQL语句完全符合需求:
select distinct on (name, age) name, age, city from people where name = ?
参数args会包含"John",和直接写字符串的效果一致。
2. 动态生成DISTINCT ON子句
如果分组列需要动态指定,可以通过字符串拼接生成对应的SQL片段:
import "strings" import "fmt" // 动态定义分组列 distinctColumns := []string{"name", "age"} distinctOnPart := fmt.Sprintf("distinct on (%s)", strings.Join(distinctColumns, ", ")) sql, args, err := squirrel.Select(fmt.Sprintf("%s name, age, city", distinctOnPart)). From("people"). Where(squirrel.Eq{"name": "John"}). ToSql()
这种方式适合需要根据业务逻辑动态调整分组列的场景,灵活性更高。
需要注意的是,这里直接拼接列名而非使用参数化,因为DISTINCT ON后面必须跟列名(而非字符串值),参数化会导致列名被转义成字符串常量,引发语法错误。
内容的提问来源于stack exchange,提问作者jim
相关产品推荐
相关产品推荐

