CASE中的WHERE子句

时间:2018-07-05 09:01:06

标签: sql

我想编写SQL,如果 @tank_id 字段为null,则不在WHERE子句中包含此字段。其他包括。

所以这是我的sql:

DECLARE @dateTo AS DATE = '01.01.2018'    
DECLARE @tank_Id int = null
SELECT sum(field_1 - field_2) FROM myTable
(CASE 
    WHEN @tank_id = 0 THEN (WHERE dt < @dateTo)
    ELSE (WHERE dt < @dateTo AND tank_id = @tank_id)
END)

但是我得到了错误:

Error: Incorrect syntax near the keyword 'WHERE'.
SQLState:  S1000
ErrorCode: 156

3 个答案:

答案 0 :(得分:3)

您提供的代码与您的文字说明不匹配。 在您的描述中,您正在询问如何不使用let arr = [{'name': '1','val': '12'},{'name': '4','val': '52'}, {'name': '11','val': '15'},{'name': '4','val': '33'}]; // group object by same name const dataObj = arr.reduce((all, {name, val}) => { if (!all.hasOwnProperty(name)) all[name] = []; all[name].push({name, val}); return all; }, {}); // map out the result into an array const result = Object.keys(dataObj).map(k => (dataObj[k])); console.log(result); (如果是@tank_id,但是在代码中,如果您不想使用null,就好像您不想使用它-所以我继续假设问题文本正确。

您不能使用0作为流控制。
case是一个表达式,只能用于根据条件返回单个标量值。
但是,对于这种查询,您不需要使用case,只需使用caseand的组合,如下所示:

or

顺便说一句,您应该始终在标签中指定要使用的RDBMS(oracle,mySql,postgreSQL,SQL Server等),并为特定版本添加标签。

答案 1 :(得分:2)

  

尝试以下

DECLARE @dateTo AS DATE = '01.01.2018'
DECLARE @tank_Id int = null
SELECT sum(field_1 - field_2) 
FROM myTable
WHERE dt < @dateTo
AND tank_id = (
case when @tank_id is null then tank_id else @tank_id end
)

答案 2 :(得分:1)

没有办法。

一个SELECT最多可以伴随一个WHERE。这就是定义的语法。

该WHERE子句(如果存在)将进行编译(用于确定物理数据访问策略的目的),因此根本无法在任何情况下做出“ WHERE子句由什么组成”方式取决于只能在运行时知道的信息(例如,正在处理的行的列中的值)。

因此,您要做的就是考虑可以遇到的情况,并编写 single WHERE子句,使其涵盖所有情况。这些评论和答案将向您显示问题中提到的特定案例的正确方法。