繁体   English   中英

通过First_Name和/或Last_Name查询sql表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM