如何创建检查数组是不是包含值的查询?戈朗戈姆

Posted

技术标签:

【中文标题】如何创建检查数组是不是包含值的查询?戈朗戈姆【英文标题】:How to create query that checks if array contains value? golang gorm如何创建检查数组是否包含值的查询?戈朗戈姆 【发布时间】:2022-01-16 09:59:21 【问题描述】:

这是模型的外观:

type Board struct 
    Id     uint `gorm:"primaryKey;autoIncrement;unique" json:"id"`
    Owner  uint `json:"owner"`
    Name string `json:"name"`
    Contributors datatypes.JSON `gorm:"type:jsonb" json:"contributors"`
    GeneratedLink string `gorm:"default:''" json:"generated_link"`
    Todos datatypes.JSON `gorm:"type:jsonb" json:"todos"`

这是贡献者值在 postgresql 列中的显示方式:

以及如何进行查询以检查贡献者数组是否包含例如 20? 我试着这样做:database.DB.Where("contributors IN ?", 20).Find(&contBoards) 但出现错误:ERROR: syntax error at or near "$1" (SQLSTATE 42601)

请有任何想法,任何选项。 P.S 使用 gorm、postgresql

【问题讨论】:

IN 将切片作为参数。试试("contributors IN ?", []int20) @sberry 有一个空数组,但我应该从表中至少收到一列 【参考方案1】:

您在WHERE 子句中使用IN 运算符来检查值是否与值列表中的任何值匹配。

IN 需要一个明确的值列表(或子查询)。

我为您的案例创建了一个示例场景,如下所示:

contributors := []int20, 25, 27

var tmp []string

for _, v := range contributors 
    tmp = append(tmp, fmt.Sprint(v))


query := "SELECT * from table_name where contributors in (" + strings.Join(tmp, ",") + ")"

ANY 适用于数组。如果数组中已有值列表,这将很有用。

使用ANY 运算符,您只能搜索一个值。

select * from table_name where value = ANY(contributors);

如果要搜索多个值,可以使用@>运算符。

@> 是“包含”运算符。

定义如下几种数据类型:

数组:http://www.postgresql.org/docs/current/static/functions-array.html

范围类型:http://www.postgresql.org/docs/current/static/functions-range.html

几何类型:http://www.postgresql.org/docs/current/static/functions-geometry.html

JSON(和 JSONB):http://www.postgresql.org/docs/current/static/functions-json.html

为了更好地理解你可以参考这个链接:Postgres: check if array field contains value?

【讨论】:

以上是关于如何创建检查数组是不是包含值的查询?戈朗戈姆的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数组是不是包含 JavaScript 中的值?

检查数组是不是包含Java中的值的最有效方法? [复制]

检查对象数组中是不是存在具有特定键值的对象

如何检查arraylist中的数组是不是包含某个值?

在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素

检查对象数组是不是包含对象