0

所以我一直在尝试研究一种方法,我可以拥有一个存储过程,它将对各种列执行动态搜索以过滤数据,但具有类似于 WHERE IN 的功能,即每列采用多个输入标准。

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

例如:未提供 FN IN ('ADAM', 'BRIAN') OR LN IN ('SMITH') OR 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)
4

3 回答 3

1

看来您正在使用 SQLServer(我的猜测基于@变量前缀),因此您可以传递一个类型的变量,而不是传递标量变量TABLEJOIN因此,您可以在条件中实现所需的逻辑。例如,

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
于 2013-01-10T21:00:45.410 回答
1

这是我得到的,它接受三个输入并返回输入值的列,并省略带有 Null 的列。这些评论用于测试输出,因为我没有您的表格。

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;
于 2013-01-10T21:26:15.440 回答
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

于 2013-01-11T14:26:25.330 回答