所以我一直在努力研究一种方法,我可以使用存储过程来对各种列进行动态搜索以过滤数据,但是具有与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)
答案 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