SQL在SELECT中分配变量,并对变量进行CASE

时间:2018-10-06 15:42:52

标签: sql sql-server tsql

有什么办法做这样的事情

声明一个变量,在一个select语句中给它赋一个值,然后在情况下使用它?

类似这样的东西

DECLARE @result BIGINT;

SELECT @result = (SELECT count(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id)
CASE WHEN @result IS NULL THEN 0 ELSE @result END AS ColNAme
FROM T2 _t2

我的想法是避免重复两次选择计数查询。

CASE 
WHEN (SELECT COUNT(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id) IS NULL THEN 0 
ELSE (SELECT COUNT(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id) END AS ColNAme

我不想使用功能。

结果集应包含所有通过T2 Id引用了T2的T项的计数

ID | Count
2  |   0
4  |   12

1 个答案:

答案 0 :(得分:1)

是的,您可以在脚本后面的select中使用定义的变量。但是您仍然使用两个select查询(请注意以下内容无效,因此请阅读整个答案):

DECLARE @result BIGINT;

SELECT @result = (SELECT count(_t.Id) FROM T _t WHERE _t.T2Id = _t2.Id GROUP BY _t.T2Id);

SELECT (CASE WHEN @result IS NULL THEN 0 ELSE @result END) AS ColNAme
FROM T2 _t2;

注意:

  • 由于未定义_t2,因此第一个查询将返回错误。
  • 第二个查询应仅使用COALESCE(@result, 0)
  • @result永远不会是NULL,因为COUNT()永远不会返回NULL值。因此,第二个查询实际上可能只是select @result
  • T2中的每一行返回相同的值很奇怪。我想您的实际查询会更有趣。
  • 除非您稍后在脚本中需要该值,否则没有理由使用变量。

因此,根据您想要的结果,我认为您只需要left joingroup by

select t2.id, count(t.id)
from t2 left join
     t 
     on t2.id = t.t2id
group by t2.id;