SQL中“MAX(SUBSTRING(CONVERT(X),1,DATALENGTH(CONVERT(X))* 1或0))”的用途是什么?

时间:2011-01-06 02:35:52

标签: sql sql-server-2000

我继承了一个存储过程,其代码如下所示。我认为这是一个穷人的PIVOT(必须在SQL Server 2000上运行)。

SELECT
    [TheDate] = MAX(
                substring(
                    CONVERT(VarChar(100), thedate, 101), 
                    1, 
                    datalength(CONVERT(VarChar(100), thedate, 101)) * 
                        ( CASE index WHEN 123 THEN 1 ELSE 0 END ))),
    [Scaled] = MAX(
                substring(
                    CONVERT(VarChar(100), Scaled), 
                    1, 
                    datalength(CONVERT(VarChar(100), Scaled)) * 
                        ( CASE index WHEN 123 THEN 1 ELSE 0 END ))),
    [Value] = MAX(
                substring(
                    CONVERT(VarChar(100), [Value]), 
                    1, 
                    datalength(CONVERT(VarChar(100), [Value])) * 
                        ( CASE index WHEN 123 THEN 1 ELSE 0 END ))),
-- Repeat for other values of "index"
GROUP BY other columns                           

有没有人见过这个结构? <不是“枢轴”的东西,而是

MAX(SUBSTRING(CONVERT(X),1,DATALENGTH(CONVERT(X))*1 or 0))

为什么不使用

MAX(CASE index WHEN 123 THEN [Value] ELSE NULL END)

1 个答案:

答案 0 :(得分:1)

有趣的报价

  

这是一个穷人的PIVOT

我碰巧知道PIVOT操作符是多个CASE语句之上的皇帝新衣服。实际上,这就是查询计划的显示方式。因此,不止一种方式来看待它。

Martin使用LEFT(,length)是转换为特定长度的快捷方式,因为LEFT(和RIGHT)隐式转换第一个参数。 对于CONVERT(varchar,date,101)这是一种特殊格式,有一种情况不会起作用。

  

DATALENGTH(CONVERT(X))* 1或0)

这可能是尝试根据列中的最大长度来调整结果列的大小,但显然这不是正确的代码(如果这是目的)。

MAX(CASE index WHEN 123 THEN [Value] ELSE NULL)

看起来好多了。 “index”是一个关键字,所以如果你从工作代码中复制你的代码片段,我会感到惊讶。也许它在2000年有效? 一些提示:

  1. 围绕“index”的括号
  2. 缺少“结束”案例
  3. 缺少CONVERT(数据似乎不是varchar,因此您需要转换)
  4. 原始返回''不为NULL时为非

    MAX(CASE [index] WHEN 123 THEN CONVERT(varchar(100),[Value],101)ELSE''END)

  5. (我为了[值]而投入101以与日期格式保持一致。它对数字没有影响)