0

そのため、さまざまな列で動的検索を実行してデータをフィルタリングするストアド プロシージャを使用できる方法を研究しようとしていますが、WHERE IN に似た機能、つまり、列ごとに複数の入力基準を取得する機能を備えています。

では、FN、LN、DOB の 3 つの列があるとします。各列に複数の値を持つ 3 つの変数の任意の組み合わせに値を提供できるストアド プロシージャが必要です。

例: 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 を使用しているようです (変数のプレフィックスに基づく私の推測です@)。そのため、スカラー変数を渡す代わりに、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
于 2013-01-10T21:00:45.410 に答える
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 に答える
1

これが私が得たものです。3 つの入力を取り、入力された値の列を返し、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 に答える