在SQL中使用where子句where条件

时间:2018-06-08 06:44:53

标签: sql sql-server

我想在TableName条件中使用where子句 例如。当我的变量@ col1为空时,我不想使用@ col1的位置,它应检查@ col2 如果@ col2也为空,则返回所有记录。 或者在变量内检查它们各自的条件/值。

declare @col1 nvarchar(50)=''
declare @col2 nvarchar(50)=''
select * from TableName
where
(isnull(@col1 ,'')!='' AND col1 =@col1 )
OR
(isnull(@col2 ,'')!='' AND col2 =@col2 )

当@ col1或@ col2为空时,不返回任何记录。

相反,当两者都是空白时,它应该返回所有记录, 如果其中任何一个包含任何值,则它应该适用于该条件。

编辑:不允许动态Sql

3 个答案:

答案 0 :(得分:1)

尝试:

declare @col1 nvarchar(50)=''
declare @col2 nvarchar(50)=''
select * from TableName
where
(isnull(@col1 ,'')='' OR col1 =@col1 )
OR
(isnull(@col2 ,'')='' OR col2 =@col2 )
OPTION (RECOMPILE)

这是在没有动态SQL的情况下处理动态条件的方法

答案 1 :(得分:1)

你可以使用LIKE

来欺骗它
declare @col1 nvarchar(50)=''
declare @col2 nvarchar(50)=''
select * from TableName
where
( col1 LIKE ISNULL(@col1, '%' )
AND
( col2 LIKE ISNULL(@col2, '%' )

当@variable为null时,它将设置为过滤LIKE'%',它返回所有值

我将逻辑更改为AND,因为假设两个@variable都有值,那么它不应该是显示两个值的显示数据吗?这导致AND逻辑。这可能需要考虑

答案 2 :(得分:1)

为此

创建动态查询

DECLARE @ COL1 NVARCHAR(50)=''

DECLARE @ COL2 NVARCHAR(50)=''

DECLARE @SQL NVARCHAR(500)

SET @ SQL ='SELECT * FROM TABLENAME'

如果(@ COL1!= '')
BEGIN

SET @ SQL = @ SQL +'WHERE COL1 ='+ @ COL1 +''

END EXEC @SQL