不同的聚合函数取决于数据类型

时间:2017-07-31 10:07:13

标签: database tsql aggregate-functions

我有一个T-SQL脚本,它返回表中的所有列,以及从MAX(DATALENGTH))sys.columns获取数据类型和最大值sys.types

但是int的最大值总是4,因为int使用4个字节。在这种情况下,我宁愿拥有该列的最高数值。

我想我可能会将查询更改为使用DataLength表示基于字符串的列,使用MAX()表示基于数字的列,但是在我到达目的地之前遇到了一些问题:

缩小示例代码

DECLARE @A bit = 1
SELECT CASE WHEN 1=1 THEN MAX(DATALENGTH(@A)) ELSE MAX(@A) END

鉴于1=1为真,我希望收到1号。 相反,我得到一个错误

  

操作数数据类型位对于max运算符无效。

我知道你不能稍微运行MAX(@A),但这不是我想要做的。我的目标是根据数据类型运行不同的聚合函数。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

我的目标是根据数据类型运行不同的聚合函数。

这将失败,因为您将获得无效的强制转换错误或将隐式转换为最高优先级数据类型

您使用bit与此无关

smalldatetime has the highest precedence因此,此代码在混合数据类型

时会产生奇怪的结果
DECLARE @foo table (
 intval int,
 floatval float,
 datetimeval smalldatetime)

 INSERT @foo VALUES
 (1, 1.567E2, '2017-07-31'),
 (2, 2.0, '2017-08-01');

 DECLARE @Switch int;
 SELECT 
        CASE 
            WHEN @Switch=1 THEN MAX(intval)
            WHEN @Switch=2 THEN MAX(floatval)
            ELSE MAX(datetimeval) 
        END
FROM 
    @foo

 SET @Switch = 1
 1900-01-03 00:00:00

 SET @Switch = 2
 1900-06-06 16:48:00

 SET @Switch = 3
 2017-08-01 00:00:00

答案 1 :(得分:0)

在这种情况下,你错过了一个演员:

SELECT CASE WHEN 1=1 THEN MAX(DATALENGTH(@A)) ELSE MAX(CAST(@A as bigint)) END