如何使查询参数可选

sra*_*vis 6 sql postgresql go

在 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)
}
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

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

args := []interface{}{}
Run Code Online (Sandbox Code Playgroud)

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

if d.Status != "" {
    statusQuery = " where status = $1 "
    args = append(args, &d.Status)
}
Run Code Online (Sandbox Code Playgroud)

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

rows, err := r.db.Query(query, args...)
Run Code Online (Sandbox Code Playgroud)


Tim*_*sen 0

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

SELECT id, title, status
FROM records
WHERE status = $1 OR $1 IS NULL;
Run Code Online (Sandbox Code Playgroud)

这里的逻辑是,如果您为 提供一个值$1,它必须与状态匹配才能返回记录。否则,如果$1被省略(即是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)
Run Code Online (Sandbox Code Playgroud)

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