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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:40:05