You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何通过姓、名、父名多列组合实现用户模糊搜索

问题原因

你原有查询返回空结果的核心问题是 LIKE 不加通配符时等价于精确匹配,你拼接后的完整姓名字符串长度远大于「Anton」,自然无法匹配到任何记录。

解决方案

可通过两种方案实现单独按姓、名、父名模糊搜索的需求:

方案1:分别匹配三个字段(推荐,逻辑清晰性能更优)

无需拼接全名字符串,直接对三个姓名字段分别做匹配:

SELECT 
    user_check.user_id, 
    user_check.status, 
    CONCAT_WS(' ', full_name_name, full_name_surname, full_name_patronymic) AS full_name
FROM user_check
JOIN check_request ON check_request.id = user_check.check_id
WHERE 
    full_name_name LIKE '%Anton%'
    OR full_name_surname LIKE '%Anton%'
    OR full_name_patronymic LIKE '%Anton%';

你可以根据匹配需求调整通配符规则:

  • 完全匹配字段值:去掉通配符改为= 'Anton'
  • 仅匹配字段开头:改为LIKE 'Anton%'

方案2:拼接全名字段后匹配(适合支持多关键词连续匹配场景)

如果需要支持输入连续的多个姓名片段查询,可以拼接后加通配符匹配:

SELECT 
    user_check.user_id, 
    user_check.status, 
    CONCAT_WS(' ', full_name_name, full_name_surname, full_name_patronymic) AS full_name
FROM user_check
JOIN check_request ON check_request.id = user_check.check_id
WHERE CONCAT_WS(' ', full_name_name, full_name_surname, full_name_patronymic) LIKE '%Anton%';
性能优化建议

如果数据量较大,建议安装pg_trgm扩展为三个姓名字段建立GIN索引,可大幅提升模糊查询效率:

  1. 安装扩展:CREATE EXTENSION IF NOT EXISTS pg_trgm;
  2. 创建索引:CREATE INDEX idx_check_request_name_trgm ON check_request USING GIN (full_name_name gin_trgm_ops, full_name_surname gin_trgm_ops, full_name_patronymic gin_trgm_ops);

内容的提问来源于stack exchange,提问作者Марк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 15:24:04