如果该语句的变量为null,则跳过WHERE语句

时间:2011-09-05 08:49:20

标签: sql-server-2008

我会有一张桌子

TABLE1
ID  Name   Country
1   Anna   Singapore
2   Brad   UK
3   Cassie US

declare @place varchar(20);
set @place='US';

select * from Table1 where country=@place;

如果值为@place则为null ???

然后,选择不会选择任何东西..

我想要的是对待,因为国家没有地方声明。而如果还有其他声明,它们将起作用..

知道怎么做吗?

2 个答案:

答案 0 :(得分:3)

对于您问题中的这个简单案例,请使用

IF ( @place IS NULL )
  SELECT *
  FROM   table1
ELSE
  SELECT *
  FROM   table1
  WHERE  country = @place  

如果您的实际情况更复杂,可以使用

select * 
from Table1 
where @place is null or country=@place 
option (recompile)

需要recompile提示的原因是为了避免单个计划适用于这两种情况并在您提供显式值的情况下进行不必要的扫描。

这些以及其他替代方案(如动态生成查询)将在文章Dynamic Search Conditions in T-SQL中详细讨论

答案 1 :(得分:1)

like=在您的情况下是等效的,因为您正在处理text(char,nchar,varchar,nvarchar)值。

而不是

WHERE  country = @place  

WHERE  country like @place  

对于变量集try 而不是

set @place='US'

尝试

set @country = isnull('''US''','''%''')

测试一下:

declare @country nvarchar(50)
set @country = isnull('''US''','''%''')
print @Country
set @country = isnull(NULL,'''%''')
print @Country

额外的引号是必要的,因为在您的示例中您使用显式值 - '是转义字符,并且您需要在每个值周围使用单引号来表示它不是表列。如果您使用的是COLUMN_NAME,则只需在%字符周围使用单引号。

根据您的SQL版本,您可能必须使用不同的通配符。 这是一个相当直接和线性的解决方案,尽管存在与开放变量相关的风险。