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?.
si ms sql
SELECT LEN(REPLACE(myColumn, 'N', '')) FROM ...
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', ''))
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
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]
Peut-être que quelque chose comme ça ...
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
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 --CorrectSELECT LEN (REPLACE ('123a123a12', 'a', ''));
- 8 --WrongSELECT LEN (REMPLACER ('123a123a12', '1', ''));
- 7 --Wrong
2) Essayez avec la solution ci-dessous pour une sortie correcte:
sélectionnez dbo.vj_count_char_from_string ('123a123a12', '2');
- 2 --Correctsé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
Le moyen le plus simple consiste à utiliser la fonction Oracle:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
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', ''))
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:
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.
essaye ça
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
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', ''))
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!
Cela retournera le nombre d'occurrence de N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table
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
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);