我正在构建一个query/{occupation}/{location}格式的Rest API

现在,在.go文件中,

position := params["occupation"]
loc := params["location"]
rows, err := db.Query(`SELECT occupation, location
                       FROM myTable WHERE occupation=$1 AND location=$2`,
                       position, loc);

如果我们同时调用占用位置和所在位置的API,则效果很好。
我希望它更加灵活,因此我可以忽略一些参数,例如,我想调用abc.com/query/dentist/NULL

然后我可以得到以下代码:
if loc == nil && position == nil {
    rows, err = db.Query(`SELECT occupation, location
                       FROM myTable);
} else if loc == nil {
    rows, err = db.Query(`SELECT occupation, location
                       FROM myTable WHERE occupation=$1`, position);
} else if position = nil {
    rows, err = db.Query(`SELECT occupation, location
                       FROM myTable WHERE location=$1`, loc);
} else {
    rows, err := db.Query(`SELECT occupation, location
                       FROM myTable WHERE occupation=$1 AND location=$2`,
                       position, loc);
}

但这是不可持续的,因为我的RestAPI可能支持10个参数,而if else子句将增长为2 ^ 10。

我想知道仅使用一个查询来解决所有情况。

这可能是一个简单的SQL问题,我只是无法弄清楚(我在使用postgres)。

最佳答案

这实际上是一个基本的变量检查,您不需要执行所有3个查询,例如:

var (
    rows     *sql.Rows
    err      error
    position = params["occupation"]
    loc      = params["location"]
)
switch {
case loc != "" && position != "":
    rows, err = db.Query(`SELECT occupation, location FROM myTable WHERE occupation=$1 AND location=$2'`, position, loc)
case loc != "":
    rows, err = db.Query(`SELECT occupation, location FROM myTable WHERE location=$1`, loc)
case position != "":
    rows, err = db.Query(`SELECT occupation, location FROM myTable WHERE occupation=$1`, position)
default:
    rows, err = db.Query(`SELECT occupation, location FROM myTable`)
}
if err != nil {
    panic(err)
}

关于sql - Go语言单个数据库查询可解决许多参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24102283/

10-16 21:49
查看更多