Какова цель "MAX (SUBSTRING (CONVERT (X), 1, DATALENGTH (CONVERT (X)) * 1 или 0))" в SQL? - PullRequest
0 голосов
/ 06 января 2011

Я унаследовал хранимую процедуру с кодом, подобным следующему. Я думаю, что это своего рода 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 Ответ

1 голос
/ 15 января 2011

Интересная цитата

Это что-то вроде PIVOT бедняка

Я знаю, что оператор PIVOT - это новая одежда императора поверх множества операторов CASE,На самом деле, так выглядит план запроса.Таким образом, существует более одного способа посмотреть на это.

Использование Мартином 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. скобки вокруг "индекса"
  2. пропущенного "конца" для дела
  3. пропущенного CONVERT (данные не похожи на varchar, поэтому вам нужнодля преобразования)
  4. оригинал возвращает '' не NULL, если он не равен 123

    MAX (CASE [индекс] КОГДА 123 ТОГДА КОНВЕРТ (varchar (100), [Value],101) ELSE '' END)

(я добавил 101 для [value], чтобы соответствовать формату даты. Это не влияет на числовые значения)

...