代码之家  ›  专栏  ›  技术社区  ›  Daniel user3757731

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

  •  0
  • Daniel user3757731  · 技术社区  · 8 年前

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

    我想我可能会将查询改为使用 DataLength 对于基于字符串的列,以及 MAX() 然而,对于基于数字的列,我甚至在到达那里之前就遇到了一些问题:

    简化示例代码

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

    考虑到这一点,我希望得到数字1 1=1 相反,我得到了一个错误

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

    我如何解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  2
  •   gbn    8 年前

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

    您使用 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
    
        2
  •  0
  •   Jimbot    8 年前

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