Eu tenho uma mesa assim
Value String
-------------------
1 Cleo, Smith
Eu quero separar a string delimitada por vírgula em duas colunas
Value Name Surname
-------------------
1 Cleo Smith
Eu preciso apenas de duas colunas extras fixas
sql-server
sql-server-2008
csv
Gurru
fonte
fonte
Respostas:
fonte
WHILE
loop (ainda pior) juntos terão um desempenho terrível. Além disso, esta é uma resposta apenas de código e nem sequer resolve o problema. Existem abordagens muito melhores por aí! Para o SQL-Server 2016+, procureSTRING_SPLIT()
(que não carrega a posição do fragmento, uma enorme falha!) Ou o realmente rápido-JSON
hack. Para versões mais antigas, procure o conhecido XML-hack (detalhes de json e xml aqui ). Ou procure um dos iTVFs de maio com base em CTEs recursivas.SELECT * FROM STRING_SPLIT('John,Jeremy,Jack',',')
Seu objetivo pode ser resolvido usando a seguinte consulta -
Não existe uma função Split pronta no servidor sql, portanto, precisamos criar uma função definida pelo usuário.
fonte
SELECT * FROM STRING_SPLIT('John,Jeremy,Jack',',')
e também verifique o link abaixo para referência
http://jahaines.blogspot.in/2009/06/converting-delimited-string-of-values.html
fonte
CHARINDEX
positivaSUBSTRING
, pelo menos para mim. :-(CONVERT(XML,'<Names><name><![CDATA[' + REPLACE(Name,',', ']]></name><name><![CDATA[') + ']]></name></name>') AS xmlname
resposta base xml é simples e limpo
referir isso
fonte
Eu acho que isso é legal
fonte
Com CROSS APPLY
fonte
Existem várias maneiras de resolver isso e muitas maneiras diferentes já foram propostas. O mais simples seria usar
LEFT
/SUBSTRING
e outras funções de string para alcançar o resultado desejado.Dados de amostra
Usando funções de string como
LEFT
Essa abordagem falha se houver mais 2 itens em uma String. Nesse cenário, podemos usar um divisor e, em seguida, usar
PIVOT
ou converter a sequência emXML
e usar.nodes
para obter itens de sequência.XML
solução baseada em dados foram detalhados pela aads e bvr em sua solução.As respostas para esta pergunta que usam divisor, todos usam
WHILE
que é ineficiente para dividir. Verifique esta comparação de desempenho . Um dos melhores divisores do mercado éDelimitedSplit8K
, criado por Jeff Moden. Você pode ler mais sobre isso aquiDivisor com
PIVOT
Resultado
DelimitedSplit8K
por Jeff Modenfonte
Tente isso (altere as instâncias de '' para '' ou qualquer outro delimitador que você deseja usar)
Exemplo de uso:
fonte
Com o SQL Server 2016, podemos usar string_split para fazer isso:
fonte
Invalid object name 'string_split'
DECLARE @cl TINYINT; SELECT @cl = compatibility_level FROM [sys].[databases] WHERE name = 'mydb'; IF @cl < 130 BEGIN ALTER DATABASE myDb SET COMPATIBILITY_LEVEL = 130 END;
Eu acho que PARSENAME é a função interessante para usar neste exemplo, conforme descrito neste artigo: http://www.sqlshack.com/parsing-and-rotating-delimited-data-in-sql-server-2012/
A função PARSENAME é projetada logicamente para analisar nomes de objetos em quatro partes. O bom de PARSENAME é que ele não se limita a analisar apenas nomes de objetos de quatro partes do SQL Server - ele analisará qualquer função ou dado de string delimitado por pontos.
O primeiro parâmetro é o objeto a ser analisado e o segundo é o valor inteiro da peça do objeto a ser retornada. O artigo está discutindo a análise e a rotação de dados delimitados - números de telefone da empresa, mas também pode ser usado para analisar dados de nome / sobrenome.
Exemplo:
O artigo também descreve o uso de uma CTE (Common Table Expression) chamada 'replaceChars', para executar PARSENAME nos valores substituídos pelo delimitador. Um CTE é útil para retornar uma exibição temporária ou conjunto de resultados.
Depois disso, a função UNPIVOT foi usada para converter algumas colunas em linhas; As funções SUBSTRING e CHARINDEX foram usadas para limpar as inconsistências nos dados, e a função LAG (nova no SQL Server 2012) foi usada no final, pois permite a referência de registros anteriores.
fonte
fonte
Podemos criar uma função como esta
Podemos então separar os valores CSV em nossas respectivas colunas usando uma instrução SELECT
fonte
Eu acho que a seguinte função funcionará para você:
Você precisa criar uma função no SQL primeiro. Como isso
Você pode chamar esta função, assim:
Implementação:
O resultado será assim:
fonte
Você pode usar uma função com valor de tabela
STRING_SPLIT
, disponível apenas no nível de compatibilidade 130. Se o nível de compatibilidade do banco de dados for inferior a 130, o SQL Server não poderá encontrar e executar aSTRING_SPLIT
função. Você pode alterar um nível de compatibilidade do banco de dados usando o seguinte comando:Sintaxe
veja a documentação aqui
fonte
Use a função Parsename ()
Resultado
fonte
Tente o seguinte:
fonte
Encontrei um problema semelhante, mas um problema complexo e, como esse é o primeiro tópico que encontrei sobre esse problema, decidi postar minha descoberta. Eu sei que é uma solução complexa para um problema simples, mas espero poder ajudar outras pessoas que acessam esse segmento à procura de uma solução mais complexa. Eu tive que dividir uma string contendo 5 números (nome da coluna: levelsFeed) e mostrar cada número em uma coluna separada. por exemplo: 8,1,2,2,2 deve ser mostrado como:
Solução 1: usando funções XML: esta solução para a solução mais lenta de longe
Solução 2: usando a função Split e pivô. (a função split divide uma string em linhas com o nome da coluna Data)
Solução 3: usando funções de manipulação de strings - o mais rápido por uma pequena margem sobre a solução 2
uma vez que o levelsFeed contém 5 valores de string, eu precisava usar a função de substring para a primeira string.
Espero que minha solução ajude outros que chegaram a este segmento procurando por uma divisão mais complexa para métodos de colunas
fonte
Usando a função de instrução :)
Usou duas funções,
1.
substring(string, position, length)
==> retorna a string do poson para o comprimento2.
instr(string,pattern)
==> retorna a posição do padrão.Se não fornecermos o argumento length na substring, ele retornará até o final da string
fonte
substring(@str, 1, charindex(@sep, @str) - 1)
seguido porsubstring(@str, charindex(@sep, @str) + 1, len(@str))
.Esta função é mais rápida:
Exemplo de uso:
fonte
Isso funcionou para mim
fonte
minha mesa:
O seguinte deve funcionar se não houver muitas colunas
Resultado:
fonte
é tão fácil, você pode consultá-lo abaixo:
fonte
fonte
Você pode encontrar a solução na Função Definida pelo Usuário do SQL para Analisar uma String Delimitada útil (em The Code Project ).
Esta é a parte do código desta página:
fonte
fonte
Descobri que o uso de PARSENAME como acima fez com que qualquer nome com um período fosse anulado.
Portanto, se houvesse uma inicial ou um título no nome seguido de um ponto, eles retornam NULL.
Eu achei que isso funcionou para mim:
fonte
fonte
fonte
Reescrevi uma resposta acima e a melhorei:
Exemplo de uso:
fonte
fonte