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).
@StringToFindnunca será nulo ou vazio.
Field To Searchresultaria 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', ''))