sql server中的case语句在where子句中,else始终为true

时间:2015-03-04 22:07:42

标签: mysql sql sql-server tsql case

我使用了永远真实的陈述,例如1 = 1在MYSQL中使用以下语法的where子句的case语句:

select * from tablename where 
(case when tablefield is not null then 
 then tablefield = 'value'
else 1 = 1 end)

我想知道如何在where子句中的sqlserver / tsql case语句中使用else 1 = 1(始终为true语句)。

5 个答案:

答案 0 :(得分:6)

你不会使用你只会写一个多条件语句的情况。在你的情况下,它看起来像

Where (tablefield = 'value'
       OR tablefield is null)

答案 1 :(得分:1)

如果要使用TSQL CASE函数,可以执行以下操作:

select * from tablename where 1 = 
(case when tablefield is not null then 
    (case when tablefield = 'value' then 1 else 0 end)
 else 1 end) 

可以简化为:

select * from tablename where 1 = 
(case when tablefield is null then 1 when tablefield = 'value' then 1 
else 0 end)

你可以省略“else 0”部分,因为当没有找到匹配时,返回NULL(不等于1)。即:

select * from tablename where 1 = 
(case when tablefield is not null then 
    (case when tablefield = 'value' then 1 end)
 else 1 end) 

select * from tablename where 1 = 
(case when tablefield is null then 1 when tablefield = 'value' then 1 end)

答案 2 :(得分:0)

抱歉,我只是混淆了查询,我打算在参数变量为null而不是tablefield时询问条件 在这种情况下,查询可能如下所示:

从tablename中选择* (当parameterfield_or_variable不为null时的情况  然后tablefield ='值' 否则1 = 1结束)

或使用parameterfield作为值 (当parameterfield_or_variable不为null时的情况  然后tablefield = parameter_field_or_variable 否则1 = 1结束)

按照问题的答案@KHeaney是对的。

然而,在mysql中描述的tsql / sqlserver中的查询将是这样的:

从tablename中选择* tablefield = @parameterfield - 将输入参数字段与表字段进行比较 或@parameter为空

所以当@parameterfield为null时,它将显示所有结果,否则它将仅限制为输入值。

谢谢

答案 3 :(得分:0)

你可以试试......

select * from tablename
where tablefield = isnull(@parameter, tablefield)

答案 4 :(得分:-1)

我知道T-SQL和MySQL都提供COALESCE,它返回提供的第一个非NULL值。

SELECT *
FROM tablename
WHERE (COALESCE(`tablefield`, 'value') = 'value')