Esteja ciente de que se houver mais de "N" ou "Y" na string, isso pode ser impreciso. Veja a solução do nickf para um método mais robusto.
Tom H
319
Este trecho funciona na situação específica onde você tem um booleano: ele responde "quantos não-Ns existem?".
SELECT LEN(REPLACE(col,'N',''))
Se, em uma situação diferente, você estava realmente tentando contar as ocorrências de um determinado caractere (por exemplo, 'Y') em qualquer string, use isto:
A segunda é a melhor resposta aqui. Todo o resto depende da situação peculiar da string contendo apenas dois caracteres diferentes.
Steve Bennett
5
Apenas uma observação: no T-SQL, você precisará usar LEN em vez de LENGTH.
Lucas
4
A função len do SQL @nickf corta os espaços finais, então se você estiver procurando por quantas ocorrências de um espaço dentro de uma string, digamos 'Olá', você obterá 0. A maneira mais fácil seria adicionar um caractere final à string antes e ajustar len como tão. SELECIONE LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr
3
Se você estiver preocupado com espaços à direita, use a função DATALENGTH.
StevenWhite
2
@StevenWhite DATALENGTH retorna o número de bytes usados. Então o NVARCHAR será duplicado.
domenicr de
18
Isso me deu resultados precisos sempre ...
Isso está no meu campo Stripes ...
Amarelo, Amarelo, Amarelo, Amarelo, Amarelo, Amarelo, Preto, Amarelo, Amarelo, Vermelho, Amarelo, Amarelo, Amarelo, Preto
DECLARE@StringToFind VARCHAR(100)="Text To Count"SELECT(LEN([Field To Search])- LEN(REPLACE([Field To Search],@StringToFind,'')))/COALESCE(NULLIF(LEN(@StringToFind),0),1)--protect division from zeroFROM[TableTo Search]
+1 Isso aprimora a segunda sugestão de @nickf para que realmente diga o número de instâncias de uma string, mesmo se a string que você está procurando tiver mais de 1 caractere
Kevin Heidt
A edição de @domenicr quebrou esta resposta e minha edição foi rejeitada. A divisão deve ser por LEN(@StringToFind).
Jamie Kitson
@jamiek desculpas, enviei o código corrigido, mas não sei por que sua edição foi rejeitada.
domenicr de
@domenicr Você deve reverter para o código original, sua edição complica o código inutilmente, @StringToFindnunca será nulo ou vazio.
Jamie Kitson
@JamieKitson vejo o contrário. Verificar se há uma divisão por zero é um princípio das melhores práticas. Além disso, contar o número de espaços em Field To Searchresultaria em uma divisão por zero porque Len(' ')retorna zero.
domenicr
2
Talvez algo assim ...
SELECT
LEN(REPLACE(ColumnName,'N',''))as NumberOfYs
FROM
SomeTable
Se você quiser contar o número de instâncias de strings com mais de um único caractere, você pode usar a solução anterior com regex ou esta solução usa STRING_SPLIT, que acredito ter sido introduzido no SQL Server 2016. Além disso, você precisará de compatibilidade nível 130 e superior.
A segunda resposta fornecida pelo nickf é muito inteligente. No entanto, ele só funciona para um comprimento de caractere da subcadeia de destino de 1 e ignora os espaços. Especificamente, havia dois espaços à esquerda em meus dados, que o SQL remove de forma útil (eu não sabia disso) quando todos os caracteres do lado direito são removidos. O que significava que
"John smith"
gerou 12 usando o método de Nickf, enquanto:
"Joe Bloggs, John Smith"
gerou 10, e
"Joe Bloggs, John Smith, John Smith"
Gerado 20.
Portanto, modifiquei ligeiramente a solução para o seguinte, o que funciona para mim:
-- DECLARE field because your table type may be textDECLARE@mmRxClaim nvarchar(MAX)-- Getting Value from tableSELECTtop(1)@mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362-- Main String ValueSELECT@mmRxClaim AS MainStringValue
-- Count Multiple Character for this number of space will be number of characterSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'GS',' '))AS CountMultipleCharacter
-- Count Single Character for this number of space will be oneSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'G',''))AS CountSingleCharacter
-- ================================================SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================-- Author: VIKRAM JAIN-- Create date: 20 MARCH 2019-- Description: Count char from string-- =============================================createFUNCTION vj_count_char_from_string
(@string nvarchar(500),@find_char char(1))
RETURNS integer
ASBEGIN-- Declare the return variable hereDECLARE@total_char int;DECLARE@position INT;SET@total_char=0;set@position =1;-- Add the T-SQL statements to compute the return value hereif LEN(@string)>0BEGINWHILE@position <= LEN(@string)-1BEGINif SUBSTRING(@string,@position,1)=@find_char
BEGINSET@total_char+=1;ENDSET@position+=1;ENDEND;-- Return the result of the functionRETURN@total_char;END
GO
Se você precisa contar o char em uma string com mais de 2 tipos de chars, você pode usar em vez de 'n' -algum operador ou regex dos chars aceitar o char que você precisa.
Aqui está o que usei no Oracle SQL para ver se alguém estava passando um número de telefone formatado corretamente:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','')ISNULLAND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0',''))=2
A primeira parte verifica se o número de telefone contém apenas números e o hífen e a segunda parte verifica se o número de telefone contém apenas dois hífens.
O que essa pergunta tem a ver com números de telefone? Ele também está pedindo uma solução T-SQL ...
Ben
-1
por exemplo, para calcular a contagem de instâncias do caractere (a) na coluna SQL -> nome é o nome da coluna '' (e em doblequote está vazio, substituo a por nocharecter @ '')
selecione len (nome) - len (substituir (nome, 'a', '')) em TESTE
selecione len ('YYNYNYYNNNYYNY') - len (substituir ('YYNYNYYNNNYYNY', 'y', ''))
Respostas:
No SQL Server:
fonte
Este trecho funciona na situação específica onde você tem um booleano: ele responde "quantos não-Ns existem?".
Se, em uma situação diferente, você estava realmente tentando contar as ocorrências de um determinado caractere (por exemplo, 'Y') em qualquer string, use isto:
fonte
Isso me deu resultados precisos sempre ...
Isso está no meu campo Stripes ...
Amarelo, Amarelo, Amarelo, Amarelo, Amarelo, Amarelo, Preto, Amarelo, Amarelo, Vermelho, Amarelo, Amarelo, Amarelo, Preto
fonte
fonte
LEN(@StringToFind)
.@StringToFind
nunca será nulo ou vazio.Field To Search
resultaria em uma divisão por zero porqueLen(' ')
retorna zero.Talvez algo assim ...
fonte
A maneira mais fácil é usando a função Oracle:
fonte
Isso retornará o número de ocorrências de N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table
fonte
tente isso
fonte
Experimente isso. Ele determina o não. de ocorrências de um único caractere, bem como as ocorrências de sub-string na string principal.
fonte
Se você quiser contar o número de instâncias de strings com mais de um único caractere, você pode usar a solução anterior com regex ou esta solução usa STRING_SPLIT, que acredito ter sido introduzido no SQL Server 2016. Além disso, você precisará de compatibilidade nível 130 e superior.
.
fonte
A segunda resposta fornecida pelo nickf é muito inteligente. No entanto, ele só funciona para um comprimento de caractere da subcadeia de destino de 1 e ignora os espaços. Especificamente, havia dois espaços à esquerda em meus dados, que o SQL remove de forma útil (eu não sabia disso) quando todos os caracteres do lado direito são removidos. O que significava que
"John smith"
gerou 12 usando o método de Nickf, enquanto:
"Joe Bloggs, John Smith"
gerou 10, e
"Joe Bloggs, John Smith, John Smith"
Gerado 20.
Portanto, modifiquei ligeiramente a solução para o seguinte, o que funciona para mim:
Tenho certeza que alguém pode pensar em uma maneira melhor de fazer isso!
fonte
Você também pode tentar isto
Resultado:
fonte
A solução abaixo ajuda a descobrir nenhum caractere presente em uma string com uma limitação:
2) Experimente a solução abaixo para obter a saída correta:
fonte
Se você precisa contar o char em uma string com mais de 2 tipos de chars, você pode usar em vez de
'n' -
algum operador ou regex dos chars aceitar o char que você precisa.fonte
Aqui está o que usei no Oracle SQL para ver se alguém estava passando um número de telefone formatado corretamente:
A primeira parte verifica se o número de telefone contém apenas números e o hífen e a segunda parte verifica se o número de telefone contém apenas dois hífens.
fonte
selecione len (nome) - len (substituir (nome, 'a', '')) em TESTE
selecione len ('YYNYNYYNNNYYNY') - len (substituir ('YYNYNYYNNNYYNY', 'y', ''))
fonte