2011-01-06 55 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

相關問題