2011-01-06 145 views
0

我已经继承了一个存储过程,其代码如下所示。这是一种穷人的PIVOT,我认为(必须在SQL Server 2000上运行)。在SQL中,“MAX(SUBSTRING(CONVERT(X),1,DATALENGTH(CONVERT(X))* 1或0))的目的是什么?

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

很高兴看到你对你的前任的理智有一些信心。 – Jimmy 2011-01-06 02:48:37

+1

相当于'MAX(CASE索引123当时剩下([Value],100)ELSE''END)'我怀疑没有理由使用这个构造。 – 2011-01-06 02:51:41

+0

当天,我记得CASE查询速度非常慢,特别是当单个查询中有多个查询时。也许多个SUBSTRING和CONVERTs在某种程度上更快。也许? – Bill 2011-01-06 14:29:41

回答

1

有趣的报价

这有点一个人可怜的PIVOT

的我碰巧知道PIVOT运算是在多个CASE语句的顶部皇帝的新装。事实上,这就是查询计划的出现方式。所以有多种方法来看待它。

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

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

这可能是尝试大小基于列的最大长度所得到的列,但是显然这不是正确的代码(如果这是目的)。

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

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

  1. 括弧 “指数”
  2. 失踪 “结束” 的情况下
  3. 缺失CONVERT(数据似乎并不为VARCHAR,所以你需要转换)
  4. 的原始返回 '' 不是NULL时,它不是123

    MAX(CASE [指数] 123 WHEN再转换(VARCHAR(100),[值],101)ELSE '' END)

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

+0

我上次测试的时候,我的PIVOT语句比集合/ CASE等效语句慢了一秒。 – 2011-01-15 04:36:00

+0

@OMG - AFAIK,它内部优化到相同的计划,所以除非你为查询引入了一些细微的细微差别,它们应该是相同的。然而,对于所有的测试,至少有10个其他因素起作用(磁盘I/O,RAM,缓冲区,计划缓存,掷骰子等),只要“秒”在一定的误差范围内,I会忽略它。 – RichardTheKiwi 2011-01-15 06:54:33

+0

@cyberwiki:“index”是一个用于混淆的词。你可能是正确的转换是其中一个原因。底层表已更改。新表更加“类型安全”。例如,日期/时间实际上是'datetime',而它们只是原始的varchar。也许其中一些实际上是原始表格所需要的。 – 2011-01-18 19:37:32

相关问题