Eu tenho uma coluna que possui valores formatados como a, b, c, d. Existe uma maneira de contar o número de vírgulas nesse valor no T-SQL?
sql-server
tsql
Orion Adrian
fonte
fonte
LTRIM
ao redor da string da seguinte maneiraSELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
:?Extensão rápida da resposta do cmsjr que funciona para cadeias de caracteres com mais de mais caracteres.
Uso:
fonte
dbo.CountOccurancesOfString( 'blah ,', ',')
, retornará 2 em vez de 1 edbo.CountOccurancesOfString( 'hello world', ' ')
falhará com a divisão por zero.DATALENGTH()/2
também é complicado por causa dos tamanhos de caracteres não óbvios. Veja stackoverflow.com/a/11080074/1094048 para obter uma maneira simples e precisa.Você pode comparar o comprimento da string com aquele em que as vírgulas são removidas:
fonte
Com base na solução da @ Andrew, você obterá um desempenho muito melhor usando uma função com valor de tabela não processual e o CROSS APPLY:
fonte
A resposta de @csmjr tem um problema em alguns casos.
Sua resposta foi fazer o seguinte:
Isso funciona na maioria dos cenários, no entanto, tente executar o seguinte:
Por alguma razão, REPLACE se livra da vírgula final, mas TAMBÉM o espaço logo antes (não sei por que). Isso resulta em um valor retornado de 5 quando você esperaria 4. Aqui está outra maneira de fazer isso que funcionará mesmo neste cenário especial:
Observe que você não precisa usar asteriscos. Qualquer substituição de dois caracteres serve. A idéia é que você estenda a string em um caractere para cada instância do caractere que está contando e subtraia a extensão do original. É basicamente o método oposto da resposta original que não vem com o estranho efeito colateral de corte.
fonte
fonte
A resposta aceita está correta, estendendo-a para usar 2 ou mais caracteres na substring:
fonte
Se sabemos que há uma limitação no LEN e no espaço, por que não podemos substituir o espaço primeiro? Então sabemos que não há espaço para confundir o LEN.
fonte
fonte
Darrel Lee, acho que tem uma resposta muito boa. Substitua
CHARINDEX()
porPATINDEX()
e você também pode fazer umaregex
pesquisa fraca ao longo de uma string ...Como, digamos que você use isso para
@pattern
:Por que você talvez queira fazer algo louco como esse?
Digamos que você esteja carregando seqüências de texto delimitadas em uma tabela intermediária, em que o campo que contém os dados é algo como um varchar (8000) ou nvarchar (max) ...
Às vezes, é mais fácil / rápido executar o ELT (Extract-Load-Transform) com dados, em vez de ETL (Extract-Transform-Load), e uma maneira de fazer isso é carregar os registros delimitados como estão em uma tabela de preparação, especialmente se você pode querer uma maneira mais simples de ver os registros excepcionais, em vez de lidar com eles como parte de um pacote SSIS ... mas essa é uma guerra santa por um segmento diferente.
fonte
A seguir, você deve executar o truque para pesquisas de caracteres únicos e vários caracteres:
A função pode ser simplificada um pouco usando uma tabela de números (dbo.Nums):
fonte
Use esse código, ele está funcionando perfeitamente. Eu criei uma função sql que aceita dois parâmetros, o primeiro parâmetro é a string longa que queremos pesquisar e pode aceitar o comprimento da string com até 1500 caracteres (é claro que você pode estendê-la ou mesmo alterá-la para tipo de dados de texto ) E o segundo parâmetro é a substring que queremos calcular o número de ocorrências (seu tamanho é de até 200 caracteres, é claro que você pode alterá-lo conforme sua necessidade). e a saída é um número inteiro, representa o número de frequência ..... aproveite.
fonte
Finalmente, escrevo esta função que deve cobrir todas as situações possíveis, adicionando um prefixo e um sufixo de caracteres à entrada. esse caractere é avaliado como diferente de qualquer caractere contido no parâmetro de pesquisa, portanto, não pode afetar o resultado.
uso
fonte
fonte
No SQL 2017 ou superior, você pode usar este:
fonte
esse código T-SQL localiza e imprime todas as ocorrências do padrão @p na frase @s. você pode executar qualquer processamento da sentença posteriormente.
o resultado é: 1 6 13 20
fonte
para SQL Server 2017
fonte
Você pode usar o seguinte procedimento armazenado para buscar valores.
fonte
@c1
a resposta que ele exige. Qual é a utilidade do restante do código, considerando que ele precisa de uma tabela pré-existente chamadatable1
para funcionar, possui um delímetro codificado e não pode ser usado em linha como a resposta aceita dos dois meses anteriores?O teste Substituir / Len é bonito, mas provavelmente muito ineficiente (especialmente em termos de memória). Uma função simples com um loop fará o trabalho.
fonte
Talvez você não deva armazenar dados dessa maneira. É uma prática ruim armazenar sempre uma lista delimitada por vírgulas em um campo. A TI é muito ineficiente para consultas. Essa deve ser uma tabela relacionada.
fonte