postgresql 使用LIKE对数组列进行Sqlalchemy查询

jfgube3f  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(244)

我有表文件与列文件名这是数组类型。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)


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

4dbbbstv

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)或一组字符,而不是空格字符,以确保查询结果的安全。

jc3wubiy

jc3wubiy2#

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

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

字符串

相关问题