我有一个用于客户搜索的存储过程。 目前,当省略中间名时,我在获取搜索结果时遇到问题。
以下是错误的细分
如果客户姓名有中间名,例如
James Mark 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
我尝试过使用
两者都没有取得预期的结果。
以前,我使用的是 FullText
Search(FTS)
,但现在已经彻底修改了。
您也可以像这个示例一样进行测试:
桌子
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(或...)