Eu tenho uma tabela que armazena informações de versão em strings com vários pontos, ou seja, '4.1.345.08', '5.0.1.100', etc. Estou procurando a maneira mais rápida de descobrir qual é maior. Existe uma maneira mais rápida ou mais fácil para os olhos do que a que eu criei abaixo? Uma ressalva é que tenho 90% de certeza de que devemos encontrar APENAS valores numéricos pontilhados aqui, mas não posso garantir isso no futuro.
DECLARE @str1 nvarchar(max)='15.0.4000.8'
DECLARE @str2 nvarchar(max)='15.6.4000.8'
SELECT
CASE
WHEN PARSENAME(@str1, 4) > PARSENAME(@str2, 4)
THEN @str1
WHEN PARSENAME(@str1, 4) < PARSENAME(@str2, 4)
THEN @str2
ELSE CASE
WHEN PARSENAME(@str1, 3) > PARSENAME(@str2, 3)
THEN @str1
WHEN PARSENAME(@str1, 3) < PARSENAME(@str2, 3)
THEN @str2
ELSE CASE
WHEN PARSENAME(@str1, 2) > PARSENAME(@str2, 2)
THEN @str1
WHEN PARSENAME(@str1, 2) < PARSENAME(@str2, 2)
THEN @str2
ELSE CASE
WHEN PARSENAME(@str1, 1) > PARSENAME(@str2, 1)
THEN @str1
WHEN PARSENAME(@str1, 1) < PARSENAME(@str2, 1)
THEN @str2
ELSE NULL
END
END
END
END
Um pouco mais fácil para os olhos, talvez. Ele se baseia nas inferências que posso fazer a partir de seus dados de amostra (que três dos octetos são < 100 e um é > 1000) - talvez seja necessário fazer ajustes nos multiplicadores para refletir quaisquer diferenças nos dados reais. Duvido que o desempenho seja diferente, mas dependendo da frequência com que você está executando essas comparações, você pode considerar colunas computadas/persistentes armazenando os cálculos.
Resultados: