如何将 nil/null 参数传递给存储函数?

How do I pass a nil/null parameter to a stored function?

服务器收到一个 GET 请求,其中包含 territory_id 参数。如果用户不需要按地区筛选,则此参数可以是 nil,或者如果用户只想获取特定地区的记录,则可以有一个 integer 数字。

代码:

func GetDataList (response http.ResponseWriter, request * http.Request) {
    params: = GetRequestParams (request.URL.Query ())
    normalID, _: = strconv.Atoi (params ["normal_id"])
    territoryId, _: = strconv.Atoi (params ["territory_id"])

    var listToCheck [] ObjectDataNormal
    query = `select * from get_list_for_predict (year: = , territory_in: = )`
    rows, err = db.Queryx (query,
        2011,
        territoryId)
    if rows! = nil {
            // code
    }
    // code
}

func GetRequestParams (values url.Values) map [string] string {
    urlValues: = make (map [string] string, len (values))
    for k, v: = range values   {
        urlValues   [k] = v [0]
    }
    return urlValues
}

postgresql中的存储过程是这样设计的,如果territory_inISNULL,那么这个参数的过滤器不起作用,否则,如果territory_in等于5,例如,在 territory 字段中的值为 5 的情况下获取记录。

如何在服务器端实现? 如果我把 territory_id = nil 放在邮递员中,我会得到:

ERROR: invalid input syntax for integer: "nil"

如果为空,则:

ERROR: invalid input syntax for integer: "null".

territroyID不能等于nil。如何根据用户请求将 null 传递给函数?

理论上我可以查询邮资功能territory_in = 0,而不是IS NULL。因为当将 string 转换为 int(strconv.Atoi (params ["territory_id"])) territory_in 时,它将被设置为 0。但我想知道如何将空参数发送到存储函数戈朗?

我使用 sqlx 和 pgx。

如果将 territoryId 保存为 *int 而不是 int,则可以通过 nil:

func strToIntPtr(s string) *int {
    i, err := strconv.Atoi(s)
    if err != nil {
        return nil
    }
    return &i 
}

territoryId := strToIntPtr(params["territory_id"])

然后 territoryId 将是 nil,只要它不是有效的 int。因此他们可以传递 nilnullany(或任何不是数字的东西),您只需将其视为 null.