我正在构建一个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/