我想编写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
答案 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
,只需使用case
和and
的组合,如下所示:
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子句,使其涵盖所有情况。这些评论和答案将向您显示问题中提到的特定案例的正确方法。