web-dev-qa-db-fra.com

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

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

YYNYNYYNNNYYNY ...

Quel est le moyen le plus simple d’obtenir le nombre total de symboles «Y» dans chaque rangée?.

87
cindi

si ms sql

SELECT LEN(REPLACE(myColumn, 'N', '')) FROM ...
79
David Hedlund

Cet extrait fonctionne dans la situation spécifique dans laquelle 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', ''))
259
nickf

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

Ceci 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
12
Ron Sell
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]
12
Aaron Dake

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

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

Vous trouverez ci-dessous une aide à la résolution pour déterminer si aucun caractère n'est présent dans une chaîne avec une limitation:

1) en utilisant SELECT LEN (REPLACE (myColumn, 'N', '')), mais limitation et sortie erronée dans les conditions suivantes:

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

SELECT LEN (REPLACE ('123a123a12', 'a', ''));
- 8 --Wrong

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

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

  • Créer une fonction et également modifier selon les besoins.
  • Et appelez 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
1
jainvikram444

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

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
1
Mayuresh Bhabal

Si vous devez compter le caractère dans une chaîne comportant plus de 2 types de caractères, vous pouvez utiliser à la place de 'n' - un opérateur ou regex des caractères acceptant le caractère dont vous avez besoin.

SELECT LEN(REPLACE(col, 'N', ''))
1
ut or

Vous pouvez aussi 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

Sortie:

 enter image description here

0
atik sarker

Voici ce que j'ai utilisé dans Oracle SQL pour voir si quelqu'un transmettait 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 ne comporte que deux traits d'union.

0
TonyK

essaye ça

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

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

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

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

0
gady RajinikanthB

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 principaux dans mes données, que SQL supprime utilement (je ne le savais pas) lorsque tous les caractères du côté droit 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 au suivant, 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
Statsanalyst

Cela retournera le nombre d'occurrence de N

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

0
Faisal Shahzad

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

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
user3469285

Essaye ça. Il détermine le non. d’occurrences à un seul caractère ainsi que les occurrences de sous-chaînes 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
Himanshu Tiwari