Ho una colonna sql che è una stringa di 100 caratteri "Y" o "N". Per esempio:
YYNYNYYNNNYYNY ...
Qual è il modo più semplice per ottenere il conteggio di tutti i simboli "Y" in ogni riga.
Ho una colonna sql che è una stringa di 100 caratteri "Y" o "N". Per esempio:
YYNYNYYNNNYYNY ...
Qual è il modo più semplice per ottenere il conteggio di tutti i simboli "Y" in ogni riga.
Risposte:
In SQL Server:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
Questo snippet funziona nella situazione specifica in cui hai un booleano: risponde "quanti non N ci sono?".
SELECT LEN(REPLACE(col, 'N', ''))
Se, in una situazione diversa, stavi effettivamente cercando di contare le occorrenze di un certo carattere (ad esempio "Y") in una determinata stringa, utilizza questo:
SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
Questo mi ha dato risultati accurati ogni volta ...
Questo è nel mio campo Stripes ...
Giallo, giallo, giallo, giallo, giallo, giallo, nero, giallo, giallo, rosso, giallo, giallo, giallo, nero
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).
@StringToFindnon sarà mai nullo o vuoto.
Field To Searchsi otterrebbe una divisione per zero perché Len(' ')restituisce zero.
Forse qualcosa del genere ...
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
Il modo più semplice è utilizzare la funzione Oracle:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
Ciò restituirà il numero di occorrenza di N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
prova questo
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
Prova questo. Determina il n. delle occorrenze di un singolo carattere così come delle occorrenze di sottostringa nella stringa principale.
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 vuoi contare il numero di istanze di stringhe con più di un singolo carattere, puoi utilizzare la soluzione precedente con regex oppure questa soluzione utilizza STRING_SPLIT, che credo sia stato introdotto in SQL Server 2016. Inoltre avrai bisogno di compatibilità livello 130 e superiore.
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
La seconda risposta fornita da nickf è molto intelligente. Tuttavia, funziona solo per una lunghezza di caratteri della sottostringa di destinazione di 1 e ignora gli spazi. In particolare, c'erano due spazi iniziali nei miei dati, che SQL rimuove utilmente (non lo sapevo) quando tutti i caratteri sul lato destro vengono rimossi. Il che significava quello
" John Smith"
ne ha generati 12 utilizzando il metodo di Nickf, mentre:
"Joe Bloggs, John Smith"
generato 10 e
"Joe Bloggs, John Smith, John Smith"
Generato 20.
Ho quindi modificato leggermente la soluzione al seguente, che funziona per me:
Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS
Sono sicuro che qualcuno può pensare a un modo migliore per farlo!
Puoi anche provare questo
-- 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
Produzione:
La soluzione seguente aiuta a scoprire il numero di caratteri presenti da una stringa con una limitazione:
1) utilizzando SELECT LEN (REPLACE (myColumn, 'N', '')), ma limitazione e output errato nelle condizioni seguenti:
SELECT LEN (REPLACE ('YYNYNYYNNNYYNY', 'N', ''));
--8 - CorrettoSELEZIONA LUNGHEZZA (REPLACE ('123a123a12', 'a', ''));
--8 - SbagliatoSELEZIONA LUNGHEZZA (SOSTITUISCI ('123a123a12', '1', ''));
--7 - Sbagliato
2) Prova con la soluzione seguente per un output corretto:
seleziona dbo.vj_count_char_from_string ('123a123a12', '2');
--2 - Correttoseleziona dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 - Corretto
-- ================================================
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 è necessario contare il carattere in una stringa con più di 2 tipi di caratteri, è possibile utilizzare al posto di 'n' -alcuni operatori o regex dei caratteri accettare il carattere necessario.
SELECT LEN(REPLACE(col, 'N', ''))
Ecco cosa ho usato in Oracle SQL per vedere se qualcuno stava passando un numero di telefono formattato correttamente:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2
La prima parte controlla se il numero di telefono ha solo numeri e il trattino e la seconda parte controlla che il numero di telefono abbia solo due trattini.
ad esempio per calcolare il conteggio delle istanze del carattere (a) nella colonna SQL -> nome è il nome della colonna '' (e in doblequote è vuoto sostituisco a con nocharecter @ '')
selezionare len (nome) - len (sostituire (nome, 'a', '')) da TEST
seleziona len ('YYNYNYYNNNYYNY') - len (sostituisci ('YYNYNYYNNNYYNY', 'y', ''))