query sql table By First_Name和/或Last_Name

时间:2015-03-12 22:12:13

标签: mysql sql sql-server

我需要编写一个查询基于first_name和/或last_name的客户表的查询。在我的查询中它可以工作,例如当我使用firstname = Ann时,它会为所有客户提供该名字,当我使用lastname = sam运行时,所有将使用姓氏,但是当我使用' Ann' '山'而不是只带一个匹配的记录,它带来所有的名字Ann或最后一个相同的山姆,所以它带来了几个记录。

 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) 

2 个答案:

答案 0 :(得分:0)

在这种情况下,我会将每个参数视为可选参数。如果提供,则执行条件,否则跳过该检查。这种类型的查询很方便,因为您不必维护n!您的查询的版本,但我必须警告您,这很容易出现错误的缓存查询计划。

如果您遇到明显减速而无法解释,您可能希望在查询结束时添加“OPTION(RECOMPILE)”。一般来说,这似乎是一个坏主意,但我宁愿SQL服务器每个查询额外花费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);

答案 1 :(得分:0)

这可能不太漂亮,但它可以像你描述的那样工作。

如果在Firstname和Lastname上完全匹配,则仅返回完全匹配(尽管可能不止一个)。如果仅匹配名字或姓氏,则返回所有匹配的记录

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))
)

您必须自己添加其他过滤器和CONVERT。