WHERE子句打开或关闭取决于变量



嗨,我使用的是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条目。如果@specificAccountNumberNULL,那么应该将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

相关内容

  • 没有找到相关文章