Tenho curvas que consistem em pontos X/Y (um array?) armazenados em uma string com o mesmo delimitador. Há 1 curva por linha. Abaixo está um exemplo simples:
0,0,1,1,2,1.9,2.9,2.8,3.6,3.5
Eu quero extrair cada curva em uma #tabela para que eu possa editá-las e, finalmente, colocá-las de volta.
X,Y
0,0
1,1
2,1.9
2.9,2.8
3.6,3.5
Uma curva pode ter de uma dúzia a centenas de valores, e os pontos podem não ser ordenados.
Qual é a maneira mais limpa/simples de fazer isso?
Eu criei uma função de valor de tabela ( tirada daqui ) para criar uma divisão ordenada de sua string.
Eu então usei esse TVF no seguinte código
O código passa em sua string para
SplitString
TVF usandoCROSS APPLY
. Usamos DOISCROSS APPLY
. Um para a coluna X (alias s1) e outro para a coluna Y (alias s2).Cada tabela (s1 e s2) tem exatamente as mesmas linhas ordenadas. Estou basicamente usando a lógica que você comentou na sua pergunta.
Sabemos que os valores da sequência X são ímpares e os valores da sequência Y são pares. A lógica é garantir que o índice s2 (que representa a coluna Y) seja +1 da linha s1 (que representa a coluna X).
WHERE s2.[Index] = s1.[Index] + 1
Queremos garantir que as linhas s1 sejam apenas as ímpares usando o
modulus operator (%)
. Se o restante de s1.index / 2 = 1, temos uma linha ímparQueremos garantir que as linhas s2 sejam apenas as pares usando o
modulus operator (%)
. Se o restante do s1.index / 2 = 2, temos uma linha parParece funcionar em seus dados de amostra.
Como você está executando o sql server 2016, você pode realmente usar a nova função string_split , e aqui está uma versão muito mais simples usando seus dados reais em seu comentário
O resultado é o seguinte