如何使用带有`WHERE IN('')`语句的通配符

问题描述 投票:0回答:2

我有一个WHERE IN ('')声明,如果没有输入,我该如何选择ALL?

sql sql-server where sql-in
2个回答
2
投票

取决于您正在使用的数据库。但你可以这样做:

-- SQLServer
DECLARE @in varchar(20) = ''
SELECT * FROM <table> WHERE (@in = '' or <field> IN (''))

-- OR
IF @in = '' 
    SELECT * FROM <table>
ELSE
    SELECT * FROM <table> WHERE <field> IN ('')

0
投票

如果要选择所有值,如果变量没有值,则只需使用ISNULL函数(将进行索引扫描):

WHERE yourField IN (ISNULL(@yourNullVariable, yourField))

让我举个例子:

DECLARE @table TABLE
(
    FooDate DATETIME,
    FooBar VARCHAR(50) 
)

INSERT INTO @table
(
    FooDate,
    FooBar
)
VALUES
(   GETDATE(), -- FooDate - datetime
    'A'         -- FooBar - varchar(50)
    )
, ('2019-02-18', 'AA')
, ('2019-01-18', 'B')
, ('2019-01-18', 'BB')

DECLARE @fooVariable VARCHAR(50) = NULL
SELECT * FROM @table tbl
WHERE  tbl.FooBar = ISNULL(@fooVariable, tbl.FooBar)

OUTPUT:

FooDate                    FooBar
2019-02-18 16:37:20.920      A
2019-02-18 00:00:00.000      AA
2019-01-18 00:00:00.000      B
2019-01-18 00:00:00.000      BB

或者使用动态SQL(将有索引搜索):

DECLARE @fooVariable VARCHAR(50) = NULL
DECLARE @sql NVARCHAR(max), @where NVARCHAR(255);

SET @sql = N'SELECT * FROM Yourtable tbl'
IF @fooVariable IS NOT NULL
    BEGIN 
        SET @where = ' tbl.FooBar = ' + @fooVariable
        SET @sql = CONCAT(@sql, @where)
    END


EXEC SP_EXECUTESQL @SQL
© www.soinside.com 2019 - 2024. All rights reserved.