Come contare le istanze di carattere nella colonna SQL


111

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.


1
Puoi specificare la piattaforma? MySQL, MSSQl, Oracle?
Vincent Ramdhanie,

Sì - con Oracle sembra che tu abbia bisogno di lunghezza - non len
JGFMK

Risposte:


96

In SQL Server:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...

18
Basta essere consapevoli che se ci sono più di "N" o "Y" nella stringa, questo potrebbe essere impreciso. Vedi la soluzione di nickf per un metodo più robusto.
Tom H

319

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', ''))

32
La seconda è la migliore risposta qui. Tutto il resto si basa sulla peculiare situazione della stringa contenente solo due caratteri diversi.
Steve Bennett

5
Solo una nota: in T-SQL, dovrai usare LEN anziché LENGTH.
Luca

4
@nickf La funzione SQL len taglia gli spazi finali quindi se stavi cercando quante occorrenze di uno spazio all'interno di una stringa diciamo 'Ciao' otterrai 0. Il modo più semplice sarebbe aggiungere un carattere finale alla stringa prima e regolare len come così. SELECT LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr

3
Se sei preoccupato per gli spazi finali, utilizza invece la funzione DATALENGTH.
StevenWhite

2
@StevenWhite DATALENGTH restituisce il numero di byte utilizzati. Quindi NVARCHAR sarà raddoppiato.
domenicr

18

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

  • 11 gialli
  • 2 Nero
  • 1 rosso
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

Questo è un modo molto intelligente! Grazie
Thelt

13
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]

+1 Questo migliora il secondo suggerimento di @nickf in modo che ti dirà effettivamente il numero di istanze di una stringa anche se la stringa che stai cercando è più di 1 carattere
Kevin Heidt

La modifica di @ domenicr ha rotto questa risposta e la mia modifica è stata rifiutata. La divisione dovrebbe essere per LEN(@StringToFind).
Jamie Kitson

@jamiek si scusa Ho inviato il codice corretto, ma non so perché la tua modifica è stata rifiutata.
domenicr

@domenicr Dovresti tornare al codice originale, la tua modifica complica il codice senza scopo, @StringToFindnon sarà mai nullo o vuoto.
Jamie Kitson

@ JamieKitson Vedo diversamente. La verifica di una divisione per zero è un principio di best practice. Inoltre, contando il numero di spazi in Field To Searchsi otterrebbe una divisione per zero perché Len(' ')restituisce zero.
domenicr

2

Forse qualcosa del genere ...

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable

1

Il modo più semplice è utilizzare la funzione Oracle:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

1

Ciò restituirà il numero di occorrenza di N

select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table


0

prova questo

declare @v varchar(250) = 'test.a,1  ;hheuw-20;'
-- LF   ;
select len(replace(@v,';','11'))-len(@v)

0

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);

0

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

0

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!


0

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:

inserisci qui la descrizione dell'immagine


0

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 - Corretto

SELEZIONA LUNGHEZZA (REPLACE ('123a123a12', 'a', ''));
--8 - Sbagliato

SELEZIONA LUNGHEZZA (SOSTITUISCI ('123a123a12', '1', ''));
--7 - Sbagliato

2) Prova con la soluzione seguente per un output corretto:

  • Crea una funzione e modifica anche secondo i requisiti.
  • E chiama la funzione come di seguito

seleziona dbo.vj_count_char_from_string ('123a123a12', '2');
--2 - Corretto

seleziona 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

0

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', ''))

-1

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.


Cosa c'entra questa domanda con i numeri di telefono? Chiede anche una soluzione T-SQL ...
Ben

-1

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', ''))

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.