sql动态where子句重复列过滤器

时间:2013-01-10 20:46:45

标签: sql filtering

所以我一直在努力研究一种方法,我可以使用存储过程来对各种列进行动态搜索以过滤数据,但是具有与WHERE IN类似的功能,即每个输入标准柱。

所以假设我有3列FN,LN,DOB。我需要一个存储过程,让我可以为三个变量的任意组合提供值,每个列有多个值。

EX:FN IN('ADAM','BRIAN')或LN IN('SMITH')或DOB未提供。

我试图遵循这个,

SELECT 
  FN,    
  LN
FROM TestData
WHERE 
  (CASE 
    WHEN @FN IS NULL THEN 'True'
    ELSE FN
  END) = (CASE 
           WHEN @FN IS NULL THEN 'True'
           ELSE @FN
         END)
  AND (CASE 
        WHEN @LN IS NULL THEN 'True'
        ELSE LN
       END) = (CASE 
                WHEN @LN IS NULL THEN 'True'
                ELSE @LN
               END)
  AND (CASE 
        WHEN @DOB IS NULL THEN '1/1/0001'
        ELSE DOB
       END) = (CASE 
                WHEN @DOB IS NULL THEN '1/1/0001'
                ELSE @DOB
              END)

3 个答案:

答案 0 :(得分:1)

您似乎正在使用SQLServer(我的猜测基于@变量前缀),因此您可以传递TABLE类型的变量,而不是传递标量变量;因此,您可以在JOIN条件下实现所需的逻辑。 例如,

CREATE TYPE MY_TABLE AS TABLE(FN varchar(20), LN varchar(20),DOB datetime2);
CREATE PROCEDURE foo (@tab1 MY_TABLE READONLY)
AS
BEGIN
  SELECT d.*
  FROM TestData d
  INNER JOIN (SELECT TOP 1 * FROM @tab1) a 
 ON (
  a.DOB IS NULL OR a.DOB = d.DOB) -- just for example, I'm not sure I got all 
  --your requirements
END

答案 1 :(得分:1)

这是我得到的,它接收三个输入并返回输入值的列,并省略Nulls列。评论用于测试输出,因为我没有你的表。

Create  Proc TestProc (@LN Nvarchar(100), @FN Nvarchar(100), @DOB Nvarchar(100)) 
As
--      TestProc    '''Hello''', '''What'',''Hmmm''', Null

Declare @SQL Nvarchar(Max),
        @Columns Nvarchar(Max) = '',
        @OrCriteria Nvarchar(Max) = '';        

If      @LN Is Not Null
Begin
        Set     @Columns = @Columns + 'LN, ';
End;         

If      @FN Is Not Null
Begin
        Set     @Columns = @Columns + 'FN, ';
End;     

If      @DOB Is Not Null
Begin
        Set     @Columns = @Columns + 'DOB, ';
End;     

Select  @OrCriteria = Coalesce(@OrCriteria + ' Or ','') + varType + ' In (' + varVal + ')' 
From   (Select  'LN' As varType, @LN As varVal
        Union
        Select  'FN', @FN
        Union
        Select  'DOB', @DOB) As n

If      @Columns <> ''
Begin
        Set     @SQL = 'Select  ' + Left(RTrim(@Columns),Len(RTrim(@Columns))-1) + '
                        From    TestData 
                        Where   (' + @OrCriteria + ')';

        Select  @SQL
        --  Exec    sp_executeSQL @SQL;                     
End
Else
Begin
        Return;
End;

答案 2 :(得分:1)

这是一些一般的Oracle示例。这不会回答你的问题,但可能会给你一些想法:

-- Case in Where clause --
SELECT empno, ename, job
  FROM scott.emp
 WHERE (CASE WHEN job = 'MANAGER' THEN '1'  
             WHEN job = 'CLERK'   THEN '2' 
        ELSE '0'  END) IN (1, 2) 
 /

此处有更多示例: https://dba.stackexchange.com/questions/1170/oracle-sql-case-in-a-where-clause