SQL COALESCE 函数不适用于 GORM

SQL COALESCE function is not working with GORM

提问人:Ajal Ck 提问时间:3/18/2023 更新时间:3/19/2023 访问量:331

问:

DB.Model(&domain.Products{}).Where("product_code", product.Product_Code).
Updates(map\[string\]interface{}{
"product_image": gorm.Expr("COALESCE(?, products.product_image)", product.Product_Image),
"size":          gorm.Expr("COALESCE(?, products.size)", product.Size),
"color":         gorm.Expr("COALESCE(?, products.color)", product.Color),
"unit_price":    gorm.Expr("COALESCE(?, products.unit_price)", product.Unit_Price),
"stock":         gorm.Expr("COALESCE(?, products.stock)", product.Stock),
})

这是一个 gorm 查询,用于在更新表时管理 null 值插入。 如果新值(传入值)为 null,我想通过将现有值保留在表中来更新表。 但是在我的代码中,表正常更新,这意味着 null 值和非 null 值都像往常一样更新。我希望有人能帮助我

我也尝试了gorm原始查询。但它也不起作用

ar.DB.Exec("UPDATE products SET size = COALESCE(?, size) WHERE product_code = ?", product.Size, product.Product_Code)
postgresql go null grails-orm 合并

评论

0赞 Stephan Schlecht 3/19/2023
在您的第一个示例中,假设 中的字段是您设置的指针,例如:->则只会更新股票。domain.ProductsProduct := domain.products{ product_code: 42, product_image: nil, size: nil, color: nil, unit_price: nil, stock: &newStock, }
0赞 Ajal Ck 3/19/2023
是的,股票已更新,但与股票一起,所有其他字段也更新为空值,因为在我的请求中,只有股票才有价值。但我想用新价值更新股票,用现有价值更新其他股票。
0赞 Stephan Schlecht 3/19/2023
我试了一下。仅更新了库存,其他字段保持不变。也许你应该分享一个最小的可重复的例子?查看 stackoverflow.com/help/minimal-reproducible-example
1赞 Ajal Ck 3/19/2023
问题解决了.错误出在指针引用中,如您在上面的评论中提到的。非常感谢您的帮助。

答:

0赞 Stephan Schlecht 3/19/2023 #1

COALESCE 返回第一个不是 的参数。nil

为此,您需要提供指针。但是,从注释中的代码片段可以看出,没有提供任何指针。因此,将更新所有指定的字段。

具体来说,你的(或你的程序中的任何名称)类型应该看起来更像这样:Products

package domain

type Products struct {
    Product_Code  int `gorm:"not null"`
    Product_Image *string
    Size          *int
    Color         *string
    Unit_price    *float64
    Stock         *int
}

请注意,字段被定义为指针。

然后,它将像这样使用:

newStock := 12
prod := domain.Products{    
    product_code: 42,   
    product_image: nil,     
    size: nil,  
    color: nil,     
    unit_price: nil,    
    stock: &newStock, 
}

正弦,除了 only 将在数据库中更新之外,所有字段都是。nilstockstock