为了账号安全,请及时绑定邮箱和手机立即绑定

如何使查询参数可选

如何使查询参数可选

Go
慕虎7371278 2022-04-26 19:48:59
在 Go 的 Postgres 中,如何使查询参数可选?在此示例status中是一个可选条件。如果没有status传递,则将从表记录中获取所有行。如何使查询参数&d.Status成为可选参数type QueryParams struct {    Status string `json:"status"`}func (r repo) GetRecords(d *QueryParams) ([]*Records, error) {    statusQuery := ""    if d.Status != "" {        statusQuery = " where status = $1 "    }    query := "select id, title, status from records " + statusQuery    rows, err := r.db.Query(query, &d.Status)}
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

Query是可变参数,因此您可以构建一个[]interface{}来保存参数:


args := []interface{}{}

然后有条件地构建参数列表:


if d.Status != "" {

    statusQuery = " where status = $1 "

    args = append(args, &d.Status)

}

运行查询时,使用以下命令展开参数...:


rows, err := r.db.Query(query, args...)


查看完整回答
反对 回复 2022-04-26
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以使用灵活的WHERE子句,例如


SELECT id, title, status

FROM records

WHERE status = $1 OR $1 IS NULL;

这里的逻辑是,如果您为 提供一个值$1,它必须与状态匹配才能返回记录。否则,如果$1被遗漏(即 is NULL),则将返回所有记录。


请注意,要使用 Postgres 驱动程序在 Go 中进行这项工作,您可能需要做一些额外的按摩。在第一次尝试时,我会尝试这样做:


statusQuery = "where status = $1 or $1::text is null"

query := "select id, title, status from records " + statusQuery

rows, err := r.db.Query(query, &d.Status)

有时驱动程序无法确定绑定参数的类型$1。通过将其显式转换为text,可以使该语句起作用。


查看完整回答
反对 回复 2022-04-26
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号