嗨,我使用的是SQL server 2008 R2。想做以下事情:
declare
-- only one of these @ vars will be used
@specificAccountNumber int = NULL
@specificAccountNumber int = 123456
select
account
,accountinfo1
,accountinfo2
from tableA
where
if @specificAccountNumber is NULL
then use the whole table
else /* @specificaAccountNumber is not null */
account = @specificAccountNumber
select
account
,accountinfo3
,accountinfo4
from tableB
where
if @specificAccountNumber is NULL
then use the whole table
else /* @specificAccountNumber is not null */
account = @specificAccountNumber
如果我没有指定帐号(或将@specificAccountNumber设置为NULL),那么查询的目标是选择所有行,但如果我指定了,那么它只会带来该帐号的数据。
在应用程序中使用不同的where子句发送不同的查询将是处理此问题的最佳方式。
但是,如果必须在数据库中完成,我认为COALESCE
将适用于这种特殊情况。试试这个:
WHERE account = COALESCE(@specificAccountNumber, account)
COALESCE
在其输入列表中选择第一个非NULL
条目。如果@specificAccountNumber
是NULL
,那么应该将account
列与其本身进行比较。我不确定在指定@specificAccountNumber
时这是否会影响性能。如果tableA
在生产中会很大,您应该检查查询计划。
您可以在where子句中使用类似的case语句
declare
-- only one of these @ vars will be used
@specificAccountNumber int = NULL
@specificAccountNumber int = 123456
select
account
,accountinfo1
,accountinfo2
from tableA
where account = CASE
WHEN @specificAccountNumber IS NULL THEN account
ELSE @specificAccountNumber END