Comment compter les instances de caractère dans la colonne SQL


111

J'ai une colonne sql qui est une chaîne de 100 caractères «Y» ou «N». Par exemple:

YYNYNYYNNNYYNY ...

Quelle est la manière la plus simple d'obtenir le nombre de tous les symboles «Y» dans chaque ligne.


1
Pouvez-vous spécifier la plate-forme? MySQL, MSSQl, Oracle?
Vincent Ramdhanie

Oui - avec Oracle, il semble que vous ayez besoin de longueur - pas de durée
JGFMK

Réponses:


96

Dans SQL Server:

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

18
Sachez simplement que s'il y a plus de "N" ou "Y" dans la chaîne, cela peut être inexact. Voir la solution de nickf pour une méthode plus robuste.
Tom H

319

Cet extrait de code fonctionne dans la situation spécifique où vous avez un booléen: il répond "combien y a-t-il de non-N?".

SELECT LEN(REPLACE(col, 'N', ''))

Si, dans une situation différente, vous essayiez réellement de compter les occurrences d'un certain caractère (par exemple 'Y') dans une chaîne donnée, utilisez ceci:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))

32
La deuxième est la meilleure réponse ici. Tout le reste repose sur la situation particulière de la chaîne ne contenant que deux caractères différents.
Steve Bennett

5
Juste une note: dans T-SQL, vous devrez utiliser LEN plutôt que LENGTH.
Luke

4
La fonction @nickf SQL len supprime les espaces de fin, donc si vous recherchez le nombre d'occurrences d'un espace dans une chaîne, disons "Bonjour", vous obtiendrez 0. Le moyen le plus simple serait d'ajouter un caractère de fin à la chaîne avant et d'ajuster len comme alors. SELECT LEN (col + '~') - LEN (REPLACE (col, 'Y', ``) + '~')
domenicr

3
Si vous êtes préoccupé par les espaces de fin, utilisez plutôt la fonction DATALENGTH.
StevenWhite

2
@StevenWhite DATALENGTH renvoie le nombre d'octets utilisés. Ainsi NVARCHAR sera doublé.
domenicr

18

Cela m'a donné des résultats précis à chaque fois ...

C'est dans mon champ Stripes ...

Jaune, jaune, jaune, jaune, jaune, jaune, noir, jaune, jaune, rouge, jaune, jaune, jaune, noir

  • 11 jaunes
  • 2 noir
  • 1 rouge
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

C'est une manière très intelligente! Merci
Thelt le

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 Cela améliore la deuxième suggestion de @nickf afin qu'elle vous indique réellement le nombre d'instances d'une chaîne même si la chaîne que vous recherchez contient plus d'un caractère
Kevin Heidt

La modification de @ domenicr a cassé cette réponse et ma modification a été rejetée. La division devrait être faite LEN(@StringToFind).
Jamie Kitson

@jamiek excuses J'ai soumis du code corrigé, mais je ne sais pas pourquoi votre modification a été rejetée.
domenicr

@domenicr Vous devez revenir au code d'origine, votre modification complique le code sans raison, @StringToFindne sera jamais nulle ou vide.
Jamie Kitson

@JamieKitson Je vois le contraire. La recherche d'une division par zéro est un principe de bonnes pratiques. En outre, compter le nombre d'espaces dans Field To Searchobtiendrait une division par zéro car Len(' ')renvoie zéro.
domenicr

2

Peut-être quelque chose comme ça ...

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

1

Le moyen le plus simple consiste à utiliser la fonction Oracle:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

1

Cela renverra le nombre d'occurrences de N

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


0

essaye ça

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

0

Essaye ça. Il détermine le non. des occurrences de caractère unique ainsi que des occurrences de sous-chaîne dans la chaîne 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

Si vous souhaitez compter le nombre d'instances de chaînes avec plus d'un seul caractère, vous pouvez soit utiliser la solution précédente avec regex, soit cette solution utilise STRING_SPLIT, qui, je crois, a été introduite dans SQL Server 2016. Vous aurez également besoin de compatibilité niveau 130 et plus.

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 deuxième réponse fournie par nickf est très intelligente. Cependant, cela ne fonctionne que pour une longueur de caractère de la sous-chaîne cible de 1 et ignore les espaces. Plus précisément, il y avait deux espaces de début dans mes données, que SQL supprime utilement (je ne le savais pas) lorsque tous les caractères de droite sont supprimés. Ce qui signifiait que

" John Smith"

généré 12 en utilisant la méthode de Nickf, alors que:

«Joe Bloggs, John Smith»

généré 10, et

«Joe Bloggs, John Smith, John Smith»

Généré 20.

J'ai donc légèrement modifié la solution comme suit, ce qui fonctionne pour moi:

Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS

Je suis sûr que quelqu'un peut penser à une meilleure façon de le faire!


0

Vous pouvez également essayer ceci

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

Production:

entrez la description de l'image ici


0

Aide de la solution ci-dessous pour savoir qu'aucun caractère n'est présent à partir d'une chaîne avec une limitation:

1) en utilisant SELECT LEN (REPLACE (myColumn, 'N', '')), mais limitation et sortie incorrecte dans la condition ci-dessous:

SELECT LEN (REMPLACER ('YYNYNYYNNNYYNY', 'N', ''));
--8 --Correct

SELECT LEN (REMPLACER ('123a123a12', 'a', ''));
--8 - Mauvais

SELECT LEN (REMPLACER ('123a123a12', '1', ''));
--7 - Mauvais

2) Essayez avec la solution ci-dessous pour une sortie correcte:

  • Créez une fonction et modifiez également selon les besoins.
  • Et appelez la fonction comme ci-dessous

sélectionnez dbo.vj_count_char_from_string ('123a123a12', '2');
--2 --Correct

sélectionnez dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 --Correct

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

Si vous avez besoin de compter le caractère dans une chaîne avec plus de 2 types de caractères, vous pouvez utiliser à la place d' 'n' -un opérateur ou d'une expression régulière des caractères accepter le caractère dont vous avez besoin.

SELECT LEN(REPLACE(col, 'N', ''))

-1

Voici ce que j'ai utilisé dans Oracle SQL pour voir si quelqu'un passait un numéro de téléphone correctement formaté:

WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2

La première partie vérifie si le numéro de téléphone ne comporte que des chiffres et le trait d'union et la deuxième partie vérifie que le numéro de téléphone n'a que deux tirets.


Qu'est-ce que cette question a à voir avec les numéros de téléphone? Il demande également une solution T-SQL ...
Ben

-1

par exemple pour calculer le nombre d'instances de caractère (a) dans la colonne SQL -> le nom est le nom de la colonne '' (et dans doblequote est vide, je remplace a par nocharecter @ '')

sélectionnez len (nom) - len (remplace (nom, 'a', '')) dans TESTING

sélectionnez len ('YYNYNYYNNNYYNY') - len (remplace ('YYNYNYYNNNYYNY', 'y', ''))

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.