如何在MySql中搜索名字、中间名和姓氏

问题描述 投票:0回答:1

我有一个用于客户搜索的存储过程。 目前,当省略中间名时,我在获取搜索结果时遇到问题。

以下是错误的细分
如果客户姓名有中间名,例如

James Mark Luke

我和James Luke一起搜索,没有出现记录



SELECT c.Id,
    c.UserId,
    c.FirstName,
    c.MiddleName,
    c.LastName,
    c.Gender,
    c.DateOfBirth,
    c.EmailAddress,
    c.MobileNumber,
    c.Status,
    c.CreatedOn,
    c.SignUpType,
    c.HolderTier,
    c.WalletNumber
FROM User c
WHERE    c.isdeleted = 0
  AND      (
                    p_search IS NULL
           OR       CONCAT_WS(' ', c.firstname, c.middlename, c.lastname) LIKE CONCAT('%', TRIM(COALESCE(p_search, '')), '%')
           OR       c.mobilenumber LIKE CONCAT('%', TRIM(COALESCE(p_search, '')), '%')
           OR       c.bvn LIKE CONCAT('%', TRIM(COALESCE(p_search, '')), '%')
           OR       c.emailaddress LIKE CONCAT('%', TRIM(COALESCE(p_search, '')), '%'))
  AND      (
                    p_careofficer IS NULL
           OR       c.careofficer = p_careofficer)
  AND      (
                    p_gender IS NULL
           OR       c.gender = p_gender)
  AND      (
                    p_status IS NULL
           OR       c.status = p_status)
  AND      (
                    p_holdertier IS NULL
           OR       c.holdertier = p_holdertier)
  AND      (
                    p_signuptype IS NULL
           OR       c.signuptype = p_signuptype)
  AND      (
                    p_datefrom IS NULL
           OR       c.createdon BETWEEN p_datefrom AND      p_dateto )
ORDER BY c.CreatedOn DESC
LIMIT p_pagesize OFFSET page_offset;
END

我尝试过使用

  1. IFNULL(中间名, '')
  2. 合并(中间名)

两者都没有取得预期的结果。

以前,我使用的是 FullText

Search(FTS)
,但现在已经彻底修改了。

mysql stored-procedures
1个回答
0
投票

您也可以像这个示例一样进行测试:

桌子

SELECT *
FROM ratingtbl;

1   James   Mark    Luke
2   James   NULL    Luke
3   Peter   NULL    Miller
4   Peter   Mark    Miller

查询

SET @searchval:="James mark";

SELECT *
FROM ratingtbl
WHERE
CASE length(@searchval) - length(REPLACE(@searchval,' ',''))
-- only 1 arguent - can be in first, mid or lastname
WHEN 0 THEN IF(@searchval IN ( firstname,midname,lastname),TRUE,FALSE)

-- two args - can be in (first,mid) or (first,last) or (mid,last)
WHEN 1 THEN IF(@searchval IN ( CONCAT_WS(' ',firstname,midname),CONCAT_WS(' ',firstname,lastname),CONCAT_WS(' ',midname,lastname) ),TRUE,FALSE)

-- three args - must be IN FIRST mid AND LAST
WHEN 2 THEN IF(@searchval = CONCAT_WS(' ',firstname,midname,lastname),TRUE,FALSE)

-- four AND more are NOT valid FOR NAMES
ELSE FALSE
END;

结果

1   James   Mark    Luke

删除注释并将变量名称更改为您的字段和 添加其余的 WHERE(或...)

© www.soinside.com 2019 - 2024. All rights reserved.