我有表 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)
但它返回空结果。 您对如何构建这样的查询有什么建议吗?
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)
或一组字符而不是空格字符,以确保查询结果的安全。
我在 SQL 中找到了解决方案:
SELECT file.id, file.names FROM file WHERE EXISTS (SELECT 1 FROM unnest(file.names) AS n
WHERE n LIKE 'abc%')