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:
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 ...
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 zeroFROM[TableTo 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
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.
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:
-- DECLARE field because your table type may be textDECLARE@mmRxClaim nvarchar(MAX)-- Getting Value from tableSELECTtop(1)@mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362-- Main String ValueSELECT@mmRxClaim AS MainStringValue
-- Count Multiple Character for this number of space will be number of characterSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'GS',' '))AS CountMultipleCharacter
-- Count Single Character for this number of space will be oneSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'G',''))AS CountSingleCharacter
-- ================================================SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================-- Author: VIKRAM JAIN-- Create date: 20 MARCH 2019-- Description: Count char from string-- =============================================createFUNCTION vj_count_char_from_string
(@string nvarchar(500),@find_char char(1))
RETURNS integer
ASBEGIN-- Declare the return variable hereDECLARE@total_char int;DECLARE@position INT;SET@total_char=0;set@position =1;-- Add the T-SQL statements to compute the return value hereif LEN(@string)>0BEGINWHILE@position <= LEN(@string)-1BEGINif SUBSTRING(@string,@position,1)=@find_char
BEGINSET@total_char+=1;ENDSET@position+=1;ENDEND;-- Return the result of the functionRETURN@total_char;END
GO
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.
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','')ISNULLAND
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', ''))
Réponses:
Dans SQL Server:
la source
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?".
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:
la source
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
la source
la source
LEN(@StringToFind)
.@StringToFind
ne sera jamais nulle ou vide.Field To Search
obtiendrait une division par zéro carLen(' ')
renvoie zéro.Peut-être quelque chose comme ça ...
la source
Le moyen le plus simple consiste à utiliser la fonction Oracle:
la source
Cela renverra le nombre d'occurrences de N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table
la source
essaye ça
la source
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.
la source
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.
.
la source
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:
Je suis sûr que quelqu'un peut penser à une meilleure façon de le faire!
la source
Vous pouvez également essayer ceci
Production:
la source
Aide de la solution ci-dessous pour savoir qu'aucun caractère n'est présent à partir d'une chaîne avec une limitation:
2) Essayez avec la solution ci-dessous pour une sortie correcte:
la source
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.la source
Voici ce que j'ai utilisé dans Oracle SQL pour voir si quelqu'un passait un numéro de téléphone correctement formaté:
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.
la source
sélectionnez len (nom) - len (remplace (nom, 'a', '')) dans TESTING
sélectionnez len ('YYNYNYYNNNYYNY') - len (remplace ('YYNYNYYNNNYYNY', 'y', ''))
la source