Eu tenho uma coluna sql que é uma string de 100 caracteres 'Y' ou 'N'. Por exemplo:
YYNYNYYNNNYYNY ...
Qual é a maneira mais fácil de obter a contagem de todos os símbolos 'Y' em cada linha.
Eu tenho uma coluna sql que é uma string de 100 caracteres 'Y' ou 'N'. Por exemplo:
YYNYNYYNNNYYNY ...
Qual é a maneira mais fácil de obter a contagem de todos os símbolos 'Y' em cada linha.
Respostas:
No SQL Server:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
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:
SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
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
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red')
FROM t_Contacts
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 zero
FROM [Table To Search]
LEN(@StringToFind)
.
@StringToFind
nunca será nulo ou vazio.
Field To Search
resultaria em uma divisão por zero porque Len(' ')
retorna zero.
Talvez algo assim ...
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
A maneira mais fácil é usando a função Oracle:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
Isso retornará o número de ocorrências de N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
tente isso
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
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.
SELECT COUNT(DECODE(SUBSTR(UPPER(:main_string),rownum,LENGTH(:search_char)),UPPER(:search_char),1)) search_char_count
FROM DUAL
connect by rownum <= length(:main_string);
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.
ALTER DATABASE [database_name] SET COMPATIBILITY_LEVEL = 130
.
--some data
DECLARE @table TABLE (col varchar(500))
INSERT INTO @table SELECT 'whaCHAR(10)teverCHAR(10)whateverCHAR(10)'
INSERT INTO @table SELECT 'whaCHAR(10)teverwhateverCHAR(10)'
INSERT INTO @table SELECT 'whaCHAR(10)teverCHAR(10)whateverCHAR(10)~'
--string to find
DECLARE @string varchar(100) = 'CHAR(10)'
--select
SELECT
col
, (SELECT COUNT(*) - 1 FROM STRING_SPLIT (REPLACE(REPLACE(col, '~', ''), 'CHAR(10)', '~'), '~')) AS 'NumberOfBreaks'
FROM @table
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:
Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS
Tenho certeza que alguém pode pensar em uma maneira melhor de fazer isso!
Você também pode tentar isto
-- DECLARE field because your table type may be text
DECLARE @mmRxClaim nvarchar(MAX)
-- Getting Value from table
SELECT top (1) @mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362
-- Main String Value
SELECT @mmRxClaim AS MainStringValue
-- Count Multiple Character for this number of space will be number of character
SELECT LEN(@mmRxClaim) - LEN(REPLACE(@mmRxClaim, 'GS', ' ')) AS CountMultipleCharacter
-- Count Single Character for this number of space will be one
SELECT LEN(@mmRxClaim) - LEN(REPLACE(@mmRxClaim, 'G', '')) AS CountSingleCharacter
Resultado:
A solução abaixo ajuda a descobrir nenhum caractere presente em uma string com uma limitação:
1) usando SELECT LEN (REPLACE (myColumn, 'N', '')), mas limitação e saída errada na condição abaixo:
SELECT LEN (REPLACE ('YYNYNYNNNYYNY', 'N', ''));
--8 --CorretoSELECT LEN (REPLACE ('123a123a12', 'a', ''));
--8 - ErradoSELECT LEN (REPLACE ('123a123a12', '1', ''));
--7 - Errado
2) Experimente a solução abaixo para obter a saída correta:
selecione dbo.vj_count_char_from_string ('123a123a12', '2');
--2 --Corretoselecione dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 --Correto
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: VIKRAM JAIN
-- Create date: 20 MARCH 2019
-- Description: Count char from string
-- =============================================
create FUNCTION vj_count_char_from_string
(
@string nvarchar(500),
@find_char char(1)
)
RETURNS integer
AS
BEGIN
-- Declare the return variable here
DECLARE @total_char int; DECLARE @position INT;
SET @total_char=0; set @position = 1;
-- Add the T-SQL statements to compute the return value here
if LEN(@string)>0
BEGIN
WHILE @position <= LEN(@string) -1
BEGIN
if SUBSTRING(@string, @position, 1) = @find_char
BEGIN
SET @total_char+= 1;
END
SET @position+= 1;
END
END;
-- Return the result of the function
RETURN @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.
SELECT LEN(REPLACE(col, 'N', ''))
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','') IS NULL AND
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.
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', ''))