Eu tenho uma tabela com uma coluna varchar contendo valores delimitados por pipe
Por exemplo:
Row 1 Column 1 = a|b|e|gg|foo
Row 2 Column 1 = oV|foo|do
Row 3 Column 1 = boop
Como posso consultar isso para retornar algo como? Duplicatas estão ok.
Resultados:
column
a
b
e
gg
foo
foo
oV
do
boop
Eu percebo que isso não é ideal, mas minhas mãos estão atadas com o esquema atual
Se você não puder alterar seu esquema atual, poderá criar uma função de divisão:
Então você pode usar um
outer apply
para se juntar à sua tabela:Que produzirá os seguintes resultados:
Consulte SQL Fiddle com demonstração
Ou se você não quiser usar uma função de divisão, poderá fazer isso com CTE:
Consulte SQL Fiddle com demonstração
Supondo que seus dados contenham caracteres alfanuméricos simples e nada para confundir o XML, você pode usar esta consulta para executar alguma manipulação de texto para fazer com que seus dados pareçam XML e, em seguida, executar XQuery para dividir a coluna.
Configuração do esquema do MS SQL Server 2012 :
Resultados (SQL Fiddle) :
Uma maneira mais rápida de fazer isso do que usar XML ou uma função é usar uma tabela de contagem. O código a seguir é uma adaptação de um excelente artigo de Jeff Moden que eu recomendo fortemente.
O código é um pouco mais complexo, mas o desempenho é significativamente melhor, especialmente porque o número de linhas que você precisa analisar aumenta.
Os primeiros CTEs (E1, E2 e E4) estão apenas configurando a tabela de contagem. O cteTally CTE então gera dinamicamente o comprimento ideal da tabela de contagem (o comprimento da string mais longa em sua tabela). Em seguida, cteStart encontra todos os pontos de separação. O resultado para o seu conjunto de dados se parece com:
Interpretar isso é um pouco complicado porque o processo adiciona um pseudo-delimitador (se ainda não existir um) na primeira posição, e esta é uma string indexada. Assim, o N1 = 1 para as linhas 1, 2 e 3. 3 não possui mais delimitadores. 1 tem delimitadores extras nas posições 3, 5, 7 e 10, observando novamente que o caractere "a" está na verdade na posição 2 nesta configuração.
De qualquer forma, a consulta final faz a divisão real e retorna o conjunto de dados desejado.
A divisão da tabela de contagem é a melhor solução não CLR para o problema de divisão de strings. Se você tiver menos de 10.000 linhas, a tabela de contagem CTE é mais rápida, mas depois dessa marca de 10K, a solução da tabela de contagem padrão se torna melhor. Um módulo de divisão de string CLR seria mais rápido do que ambos, mas sei que muitas lojas hesitam em instalar módulos CLR.