Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 不同的聚合函数取决于数据类型_Database_Tsql_Aggregate Functions - Fatal编程技术网

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

Database 不同的聚合函数取决于数据类型,database,tsql,aggregate-functions,Database,Tsql,Aggregate Functions,我有一个T-SQL脚本,它返回表中的所有列,以及数据类型和最大值max(DATALENGTH))从sys.columns和sys.types获取它 但是,ints的最大值始终为4,因为ints使用4个字节。在这种情况下,我希望列中的数值最高 我想我可能会将查询更改为对基于字符串的列使用DataLength,对基于数字的列使用MAX() 缩小示例代码 如果1=1为真,我希望收到数字1。 相反,我得到了一个错误 操作数数据类型位对于max运算符无效 我知道你一点也不能运行MAX(@A),但这不是我想

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

但是,ints的最大值始终为4,因为ints使用4个字节。在这种情况下,我希望列中的数值最高

我想我可能会将查询更改为对基于字符串的列使用
DataLength
,对基于数字的列使用
MAX()

缩小示例代码 如果
1=1
为真,我希望收到数字1。 相反,我得到了一个错误

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

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


如何解决此问题?

在这种情况下,您缺少一个演员阵容:

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

在这种情况下,您缺少一个强制类型转换:

SELECT CASE WHEN 1=1 THEN MAX(DATALENGTH(@A)) ELSE MAX(CAST(@A as bigint)) END
我的目标是根据数据类型运行不同的聚合函数

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

您对
位的使用与此处无关

所以这段代码在混合数据类型时会给出奇怪的结果

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
我的目标是根据数据类型运行不同的聚合函数

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

您对
位的使用与此处无关

所以这段代码在混合数据类型时会给出奇怪的结果

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

什么问题?如果你选择了一个未知问题的解决方案,我们所拥有的一切是什么?如果您选择了解决未知问题的解决方案:
案例
不能可靠地提供短路评估,我们所拥有的一切。请参阅和。旁白:
案例
无法可靠地提供短路评估。看,还有。