SQL Query中的动态WHERE子句

时间:2013-09-15 18:57:17

标签: sql sql-server stored-procedures

我想执行此查询

select * from locations where region=1 or region=2

但在某些情况下我不想在WHERE(or region=2)中包含第二个子句 有条件运行or语句吗?

5 个答案:

答案 0 :(得分:2)

检查where语句中的条件

select * from locations 
where region=1 
or (region=2 and @checkRegion2=1)

答案 1 :(得分:2)

如果你想要genralizable查询,你可以为此声明表变量(假设你使用的是SQL服务器):

declare @regions table (id int primary key)

然后根据条件填写它:

insert into @regions select 1
if @use2 = 1
    insert into @regions select 2

现在您可以运行此查询:

select *
from location as l
where exists (select * from @regions as r where r.id = l.region)

select *
from location as l
where l.region in (select r.id from @regions as r)

答案 2 :(得分:0)

DECLARE @RUNAFTERBIT VARCHAR(10)
SET @RUNAFTERBIT = 'TRUE'

IF @RUNAFTERBIT = 'TRUE'
  SELECT * FROM LOCATIONS WHERE REGION = 1 OR REGION = 2
ELSE
  SELECT * FROM LOCATIONS WHERE REGION = 1 
END IF

答案 3 :(得分:0)

您可以使用动态SQL:

DECLARE @Query VARCHAR(MAX) = 'SELECT * FROM locations WHERE region=1 '

IF(@RUNAFTERBIT = 'TRUE')
BEGIN
    SET @Query = @Query + ' OR REGION = 2'
END

EXEC(@Query)

答案 4 :(得分:0)

在某些情况下,CASE表达式可用于执行短路评估:

declare @AlternateRegion as Int = 2;

select *
  from Locations
  where case
    when Region = 1 then 1
    when @AlternateRegion is not NULL then
      case when Region = @AlternateRegion then 1 else 0 end
    else 0
    end = 1
在存在聚合函数时,

CASE无法可靠地提供短路评估。请参阅CASE / COALESCE won't always evaluate in textual order Aggregates Don't Follow the Semantics Of CASE