Sqlalchemy 使用 LIKE 查询数组列

问题描述 投票:0回答:2

我有表 File ,其列 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
2个回答
1
投票

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

例如:

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

第一个字符

%
是强制性的,因为搜索的单词可能位于从数组生成的字符串中的任何位置。

然后您可以在搜索词前后添加

array_to_string()
函数中指定的分隔符(
LIKE '% name2 %'
),以排除类似
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)
或一组字符而不是空格字符,以确保查询结果的安全。


0
投票

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

SELECT file.id, file.names FROM file WHERE EXISTS (SELECT 1 FROM unnest(file.names) AS n
WHERE n LIKE 'abc%')
© www.soinside.com 2019 - 2024. All rights reserved.