且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

搜索条件的复杂Where子句

更新时间:2023-02-06 08:28:32

我找到了解决方案:我使用where子句而不是IF语句达到相同的结果

I Found the solution : Instead using where clause i am using IF statement to achieve same result

ALTER PROCEDURE [dbo].[usp_GET_User_by_Admin_Employer_Customer]
    @Search_Field INT , --1 - Company ID, 2 Company Name,3 Company Tax ID
    @Search_Criteria VARCHAR(100) ,
    @Search_Option INT ,--1 - Equals, 2 - Greater Than , 3 - Less Than , 4 -Contains
    @executing_User_Id INT
AS -- Search by Company_ID
    IF ( @Search_Field = 1
         AND @Search_Option = 1
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   ISNUMERIC(@Search_Criteria) = Comp_Id
        
    IF ( @Search_Field = 1
         AND @Search_Option = 2
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Id >  @Search_Criteria 
        
    IF ( @Search_Field = 1
         AND @Search_Option = 3
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Id < @Search_Criteria 
        
    IF ( @Search_Field = 1
         AND @Search_Option = 4
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Id LIKE '%' + @Search_Criteria + '%'
			
		
		-- Search By Company_Name			    
    IF ( @Search_Field = 2
         AND @Search_Option = 1
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   @Search_Criteria = Comp_Name
				
    IF ( @Search_Field = 2
         AND @Search_Option = 4
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Name LIKE '%' + @Search_Criteria + '%'
        
     IF ( @Search_Field = 2
         AND @Search_Option = 2
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Name > @Search_Criteria 
				
    IF ( @Search_Field = 2
         AND @Search_Option =3
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Name < @Search_Criteria 
			   
			    
		 -- Search By Company_Tax_Id			    
	IF ( @Search_Field = 3
         AND @Search_Option = 1
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   @Search_Criteria = Comp_Tax_Id
        
    IF ( @Search_Field = 3
         AND @Search_Option = 2
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE  Comp_Tax_Id > @Search_Criteria 
	 
	 IF ( @Search_Field = 3
         AND @Search_Option = 3
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE  Comp_Tax_Id < @Search_Criteria			
    
	IF ( @Search_Field = 3
         AND @Search_Option = 4
       ) 
        SELECT  *
        FROM    dbo.tbl_Company
        WHERE   Comp_Tax_Id LIKE '%' + @Search_Criteria + '%'


即使您可以正常使用,我也会提出另一种可能性.您还可以动态构建该语句并执行它.看看以下内容:
Even though you got it working, I''ll throw another possibility. You can also build the statement dynamically and execute it. Have a look at the following:
CREATE PROCEDURE [dbo].[usp_GET_User_by_Admin_Employer_Customer]
    @Search_Field INT , --1 - Company ID, 2 Company Name,3 Company Tax ID
    @Search_Criteria VARCHAR(100) ,
    @Search_Option INT ,--1 - Equals, 2 - Greater Than , 3 - Less Than , 4 -Contains
    @executing_User_Id INT
AS 
   DECLARE @sql varchar(2000)
BEGIN
   -- set the start of the statement
   SET @sql = 'SELECT * FROM dbo.tbl_Company WHERE ';

   -- decide the fields
   SET @sql = @sql + 
      CASE @Search_Field 
         WHEN 1 THEN 'Comp_Id '
         WHEN 2 THEN 'Comp_Name '
         WHEN 3 THEN 'Comp_Tax_Id '
      END;
   -- decide the condition
   SET @sql = @sql + 
      CASE @Search_Option 
         WHEN 1 THEN ' = @Search_Criteria '
         WHEN 2 THEN ' > @Search_Criteria '
         WHEN 3 THEN ' < @Search_Criteria '
         WHEN 4 THEN ' LIKE ''%@Search_Criteria%'' '
      END;

   -- execute statement;
   EXEC sp_executesql @sql, N'@Search_Criteria VARCHAR(2000)', Search_Criteria;
END;


那还没有经过测试也没有完成,但是可以让您了解如何构造该语句.

根据情况,此方法可能会(或可能不会)导致更易于维护的过程:)


That is not tested nor complete but to give you the idea how you can also construct the statement.

Depending on the situation this approach may (or may not) lead to more maintainable procedure :)


尝试使用: ^ ]

更多信息:
在存储过程中构建动态SQL [ ^ ]
如何在存储过程之间共享数据 [
Try to use: COALESCE[^]

More at:
Building Dynamic SQL In a Stored Procedure[^]
How to share data between stored procedures[^]