我有表文件与列文件名这是数组类型。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)
型
但是它返回空的结果。你有什么建议,如何建立这样的查询?
我有表文件与列文件名这是数组类型。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)
型
但是它返回空的结果。你有什么建议,如何建立这样的查询?
2条答案
按热度按时间4dbbbstv1#
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)
或一组字符,而不是空格字符,以确保查询结果的安全。jc3wubiy2#
我在SQL中找到了解决方案:
字符串