[英]filter first_name and last_name from two relation pointing to same table
[英]query sql table By First_Name and/or Last_Name
我需要编写一个查询,查询基于first_name和/或last_name的客户表。 在我的查询中,例如当我使用firstname = Ann运行时,它会带上所有具有该名字的客户,当我使用lastname = sam运行时,它将带上所有姓氏的所有客户,但是当我使用'Ann'运行时,会使用'Sam'仅带来一个与之匹配的记录,它带所有姓安或姓氏相同的山姆,因此带来了多个记录。
select * from customer
where WHERE --(CONVERT(varchar(50),decryptbykey([Account_Number]))=
@UserName or ce.Email= @UserName or Username=@UserName )
((CONVERT(varchar(50),decryptbykey([First_Name]))) =@First_Name)
and (CONVERT(varchar(50),decryptbykey([Last_Name])) =@Last_Name)
or ((CONVERT(varchar(50),decryptbykey([First_Name]))) =@First_Name)
or (CONVERT(varchar(50),decryptbykey([Last_Name])) =@Last_Name)
在这种情况下,我会将每个参数都视为可选参数。 如果提供,则强制执行条件,否则跳过该检查。 在不必维护n的意义上,这种查询很方便。 版本的查询,但是我必须警告您,这很容易导致错误的缓存查询计划。
如果遇到无法解释的严重减速,则可能需要在查询末尾加上“ OPTION(RECOMPILE)”。 通常,这似乎是个坏主意,但我宁愿SQL Server每个查询多花5毫秒而不是30秒一次。 锁,数据库负载,用户体验等。通常,强制查询选项通常不是一个好主意,只有在没有其他合理的解决方案时才应这样做。
IF (@UserName_Name = '')
SET @First_Name = NULL;
IF (@First_Name = '')
SET @First_Name = NULL;
IF (@Last_Name = '')
SET @First_Name = NULL;
select *
from customer
where (@UserName IS NULL
OR Username = @UserName
OR Email = @UserName
OR CONVERT(varchar(50), decryptbykey([Account_Number])) = @UserName)
AND (@First_Name IS NULL OR CONVERT(varchar(50), decryptbykey([First_Name])) = @First_Name)
AND (@Last_Name IS NULL OR CONVERT(varchar(50), decryptbykey([First_Name])) = @Last_Name);
这可能并不漂亮,但可以按照您的描述进行操作。
如果在“姓氏”和“姓氏”上都完全匹配,则只返回完全匹配(尽管可能不止一个)。 如果仅在“名字”或“姓氏”上匹配,则返回所有匹配的记录
SELECT * FROM customer
WHERE
(
(First_name = (CASE WHEN (First_name = @First_Name AND Last_name = @Last_Name) THEN @First_Name END))
AND
(Last_name = (CASE WHEN (First_name = @First_Name AND Last_name = @Last_Name) THEN @Last_Name END))
)
OR
(
(First_name = (CASE WHEN (First_name = @First_Name AND Last_name <> @Last_Name) THEN @First_Name END))
OR
(Last_name = (CASE WHEN (First_name <> @First_Name AND Last_name = @Last_Name) THEN @Last_Name END))
)
您必须添加其他过滤器并自己转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.