如何在TypeORM中对字符串数组字段使用ILike进行模糊查询
实现TypeORM数组字段(skills)的部分匹配查询
针对你定义的UserEntity中skills数组字段,要实现类似ILike("%${query}%")的部分匹配搜索,可以利用PostgreSQL的内置函数来实现,以下是两种可靠的方案:
方案一:通过array_to_string转换数组后匹配
将数组转为字符串,再对字符串执行模糊匹配,适合不需要严格区分元素边界的场景:
import { getRepository } from "typeorm"; import { UserEntity } from "./path-to-user-entity"; async function searchUsersBySkillPartial(query: string) { const userRepository = getRepository(UserEntity); // 用不会出现在技能中的分隔符(比如|||)避免匹配干扰 return await userRepository.createQueryBuilder("user") .where("array_to_string(user.skills, '|||') ILIKE :query", { query: `%${query}%` }) .getMany(); }
方案二:通过unnest展开数组后匹配元素
将数组展开为单个元素,对每个元素单独做模糊匹配,再通过EXISTS确保用户至少有一个匹配的技能,这种方式更精准:
import { getRepository } from "typeorm"; import { UserEntity } from "./path-to-user-entity"; async function searchUsersBySkillPartial(query: string) { const userRepository = getRepository(UserEntity); return await userRepository.createQueryBuilder("user") .where("EXISTS (SELECT 1 FROM unnest(user.skills) AS skill WHERE skill ILIKE :query)", { query: `%${query}%` }) .getMany(); }
注意事项
- 以上方案基于PostgreSQL数据库(你的
text array字段类型对应PostgreSQL的text[]),如果使用其他数据库(如MySQL),需要替换为对应数据库的数组处理语法。 - 若要区分大小写,将
ILIKE替换为LIKE即可。
内容的提问来源于stack exchange,提问作者user22128783
相关产品推荐
相关产品推荐

