【问题标题】:query sql table By First_Name and/or Last_Name通过 First_Name 和/或 Last_Name 查询 sql 表
【发布时间】:2015-03-12 22:12:12
【问题描述】:

我需要编写一个查询,根据 first_name 和/或 last_name 查询客户表。在我的查询中,例如,当我使用 firstname =Ann 运行时,它会为所有客户带来该名字,而当我使用 lastname=sam 运行时,它会带来所有姓氏,但是当我使用 'Ann','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) 

【问题讨论】:

  • Emm... 您可能需要指定您的问题是关于 Microsoft 还是 MySQL 并适当地标记。从语法上看,我认为你的意思是微软。

标签: mysql sql sql-server


【解决方案1】:

在这种情况下,我会将每个参数视为可选参数。如果提供,则强制执行该条件,否则跳过该检查。这种类型的查询很方便,因为您不必维护 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);

【讨论】:

  • 我使用了这个,但现在它没有返回任何东西。
  • 在编写这些查询时,我建议自己验证每个条件。测试用户名,然后是名字,然后是姓氏,最后将它们全部放在一起。如果您遇到问题,我可能误解了确切的比较,但一般格式应该适合您。
【解决方案2】:

这可能不是很漂亮,但正如您所描述的那样有效。

如果 Firstname 和 Lastname 完全匹配,则仅返回完全匹配(但可能不止一个)。如果仅匹配 Firstname OR 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多