根据传递给存储过程的标志在 SQL 查询中应用 and/or
Apply and/or in SQL query based on flags passed to stored procedure
我需要一个可以根据标志动态应用 and/or 子句的查询。我正在使用 SQL Server 2014。
考虑以下示例:
declare @UGFlag char(1)
declare @PGFlag char(1)
declare @DoctrateFlag char(1)
create table #FiltQual(Candidate_ID int) -- Final Output
create table #FiltUG(Candidate_ID int)
create table #FiltPG(Candidate_ID int)
create table #FiltDOC(Candidate_ID int)
insert into #FiltUG
select '1' union
select '2' union
select '3'
insert into #FiltPG
select '1' union
select '2'
insert into #FiltPG
select '2' union
select '3' union
select '4' union
select '5'
--Case 1
set @UGFlag='Y'
set @PGFlag='Y'
set @DoctrateFlag = 'Y'
--Desired Output
Candidate_ID
2
Case 2
set @UGFlag='N'
set @PGFlag='N'
set @DoctrateFlag = 'N'
Desired Output
Candidate_ID
1
2
3
4
5
Case 3:
set @UGFlag='N'
set @PGFlag='Y'
set @DoctrateFlag = 'N'
Desired Output
Candidate_ID
1
2
Case 4:
set @UGFlag='Y'
set @PGFlag='Y'
set @DoctrateFlag = 'N'
Desired Output
Candidate_ID
1
2
我想根据 trhee 标志将数据填充到 #FiltQual
中。标志可以包含 'Y' 或 'N',如果是 'Y',则应应用 'And',否则应应用 'or'。
不是一个完整的答案,但下面的抽象模式可以工作。您所做的是将条件指示器检查与实际检查叠加在一起。
SELECT *
FROM Table
WHERE (@ConditionIndicator = 'Y' AND (Column = @Value))
一个更具体的例子,它没有涉及你的示例数据:
DECLARE @Filter NCHAR(1);
SET @Filter = 'Y'; -- Change to 'N' (or anything other than 'Y') to see the results change
SELECT *
FROM sysobjects
WHERE (@Filter = 'Y' AND name = 'sysrscols')
当@Filter == 'Y'时,它returns 1行。当@Filter 不是 'Y' 时,它 returns 没有行。
希望这对您有所帮助。
编辑添加:
抱歉,只是 re-read 你的问题。您需要更像下面的东西,但它有效地使用了相同的模式:
DECLARE @Filter NCHAR(1);
SET @Filter = 'Y';
SELECT *
FROM sysobjects
WHERE (@Filter = 'Y' AND (name = 'sysrscols' AND xtype = 'S'))
OR (@Filter != 'Y' AND (name = 'sysrscols' OR xtype = 'S'))
像这样的东西应该可以工作:
SELECT COALESCE(UG.Candidate_ID, PG.Candidate_ID, DOC.Candidate_ID) AS Candidate_ID
FROM #FiltUG AS UG
FULL OUTER JOIN #FiltPG AS PG ON UG.Candidate_ID = PG.Candidate_ID
FULL OUTER JOIN #FiltDOC AS DOC ON PG.Candidate_ID = DOC.Candidate_ID
WHERE ((@UGFlag='Y' AND UG.Candidate_ID IS NOT NULL) OR (@UGFlag='N'))
AND
((@PGFlag='Y' AND PG.Candidate_ID IS NOT NULL) OR (@PGFlag='N'))
AND
((@DoctrateFlag='Y' AND DOC.Candidate_ID IS NOT NULL) OR (@DoctrateFlag='N'))
关键思想是在所有 table 之间使用 FULL JOIN
。然后使用,例如:
(@UGFlag='Y' AND UG.Candidate_ID IS NOT NULL) OR (@UGFlag='N')
如果相应的 table 过滤器 (@UGFlag
) 等于 [=16],我们将 NOT NULL
条件应用于 table (#FiltUG
) =].
我需要一个可以根据标志动态应用 and/or 子句的查询。我正在使用 SQL Server 2014。
考虑以下示例:
declare @UGFlag char(1)
declare @PGFlag char(1)
declare @DoctrateFlag char(1)
create table #FiltQual(Candidate_ID int) -- Final Output
create table #FiltUG(Candidate_ID int)
create table #FiltPG(Candidate_ID int)
create table #FiltDOC(Candidate_ID int)
insert into #FiltUG
select '1' union
select '2' union
select '3'
insert into #FiltPG
select '1' union
select '2'
insert into #FiltPG
select '2' union
select '3' union
select '4' union
select '5'
--Case 1
set @UGFlag='Y'
set @PGFlag='Y'
set @DoctrateFlag = 'Y'
--Desired Output
Candidate_ID
2
Case 2
set @UGFlag='N'
set @PGFlag='N'
set @DoctrateFlag = 'N'
Desired Output
Candidate_ID
1
2
3
4
5
Case 3:
set @UGFlag='N'
set @PGFlag='Y'
set @DoctrateFlag = 'N'
Desired Output
Candidate_ID
1
2
Case 4:
set @UGFlag='Y'
set @PGFlag='Y'
set @DoctrateFlag = 'N'
Desired Output
Candidate_ID
1
2
我想根据 trhee 标志将数据填充到 #FiltQual
中。标志可以包含 'Y' 或 'N',如果是 'Y',则应应用 'And',否则应应用 'or'。
不是一个完整的答案,但下面的抽象模式可以工作。您所做的是将条件指示器检查与实际检查叠加在一起。
SELECT *
FROM Table
WHERE (@ConditionIndicator = 'Y' AND (Column = @Value))
一个更具体的例子,它没有涉及你的示例数据:
DECLARE @Filter NCHAR(1);
SET @Filter = 'Y'; -- Change to 'N' (or anything other than 'Y') to see the results change
SELECT *
FROM sysobjects
WHERE (@Filter = 'Y' AND name = 'sysrscols')
当@Filter == 'Y'时,它returns 1行。当@Filter 不是 'Y' 时,它 returns 没有行。
希望这对您有所帮助。
编辑添加:
抱歉,只是 re-read 你的问题。您需要更像下面的东西,但它有效地使用了相同的模式:
DECLARE @Filter NCHAR(1);
SET @Filter = 'Y';
SELECT *
FROM sysobjects
WHERE (@Filter = 'Y' AND (name = 'sysrscols' AND xtype = 'S'))
OR (@Filter != 'Y' AND (name = 'sysrscols' OR xtype = 'S'))
像这样的东西应该可以工作:
SELECT COALESCE(UG.Candidate_ID, PG.Candidate_ID, DOC.Candidate_ID) AS Candidate_ID
FROM #FiltUG AS UG
FULL OUTER JOIN #FiltPG AS PG ON UG.Candidate_ID = PG.Candidate_ID
FULL OUTER JOIN #FiltDOC AS DOC ON PG.Candidate_ID = DOC.Candidate_ID
WHERE ((@UGFlag='Y' AND UG.Candidate_ID IS NOT NULL) OR (@UGFlag='N'))
AND
((@PGFlag='Y' AND PG.Candidate_ID IS NOT NULL) OR (@PGFlag='N'))
AND
((@DoctrateFlag='Y' AND DOC.Candidate_ID IS NOT NULL) OR (@DoctrateFlag='N'))
关键思想是在所有 table 之间使用 FULL JOIN
。然后使用,例如:
(@UGFlag='Y' AND UG.Candidate_ID IS NOT NULL) OR (@UGFlag='N')
如果相应的 table 过滤器 (@UGFlag
) 等于 [=16],我们将 NOT NULL
条件应用于 table (#FiltUG
) =].