【问题标题】:Sqlalchemy query to array column using LIKESqlalchemy 使用 LIKE 查询数组列
【发布时间】:2021-12-19 11:49:45
【问题描述】:

我有列 file_names 的表格文件,它是 ARRAY 类型。 W 想使用通配符构建任何数组元素类似于“abc*”的查询搜索记录。

我试过了:

File.names.any("abc%", operator= operators.like_op).all()

但它不起作用。 它返回 sql:

SELECT file.id, file.names FROM file WHERE 'abc%' LIKE ANY(file.names)

但它返回空结果。 您有什么建议,如何构建这样的查询?

【问题讨论】:

    标签: python sql postgresql sqlalchemy sql-like


    【解决方案1】:

    like 运算符适用于文本,而不适用于数组,因此在应用 like 运算符之前,您需要找到一种将数组转换为文本的方法。要在 sql 中执行此操作,您可以使用 array_to_string() 函数,请参阅 manual

    例如:

    select array_to_string('{"name_1", "name_2", "name_3"}' :: text[], ' ') LIKE '%name_2%' 返回true

    第一个字符% 是强制性的,因为搜索的单词可能位于数组结果字符串中的任何位置。

    然后您可以在搜索词(LIKE '% name2 %')之前和之后添加array_to_string()函数中指定的分隔符,以便排除somename_2等结果。

    例如:

    select array_to_string('{"name_1", "name_2", "name_3"}' :: text[], ' ') LIKE '% name_2 %' 返回true

    但是

    select array_to_string('{"name_1", "somename_2", "name_3"}' :: text[], ' ') LIKE '% name_2 %' 返回false

    最后但同样重要的是,对于分隔符,您可以指定一个不可打印的字符,例如 chr(12) 或一组字符而不是空格字符,以确保查询结果的安全。

    【讨论】:

    • 但我尝试询问 ARRAY 的元素,它们是字符串,并对 ARRAY 中的每个元素使用 LIKE。如果我们说 array_to_string(),当我连接所有元素时,使用 LIKE 对这个连接的字符串的查询不会像单独对每个元素一样产生效果。
    • @Wald,当使用array_to_string() 函数时,您可以将分隔符指定为文本,可以使用不可打印的 ascii 字符,例如 chr(12),也可以使用不能出现在数组元素。我建议第一个解决方案。
    • f.e 列名称的值为 ['name_1', 'name_2', 'name_3']。在 array_to_string() 之后,如果我查询“name_2%”,我没有得到这条记录,因为在“name_2”之前是“name_1”,所以尽管数组元素匹配模式,它还是不匹配模式。这是个问题。
    • select array_to_string('{"name_1", "name_2", "name_3"}' :: text[], ' ') LIKE '%name_2%'returns true
    • 你是对的。但我不想问'%name_2%',而是问name_2%,因为我对结果 f.e somename_2 不感兴趣
    【解决方案2】:

    我在 SQL 中找到了解决方案:

    SELECT file.id, file.names FROM file WHERE EXISTS (SELECT 1 FROM unnest(file.names) AS n
    WHERE n LIKE 'abc%')
    

    它有效。 但我不知道如何在 sqlalchemy 中询问这样的查询。有什么想法吗?

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 2011-11-05
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2020-03-10
      相关资源
      最近更新 更多