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.
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.
Réponses:
Dans SQL Server:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
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', ''))
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
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]
LEN(@StringToFind)
.
@StringToFind
ne sera jamais nulle ou vide.
Field To Search
obtiendrait une division par zéro car Len(' ')
renvoie zéro.
Peut-être quelque chose comme ça ...
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
Le moyen le plus simple consiste à utiliser la fonction Oracle:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
Cela renverra le nombre d'occurrences de N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
essaye ça
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
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);
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
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!
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:
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 --CorrectSELECT LEN (REMPLACER ('123a123a12', 'a', ''));
--8 - MauvaisSELECT LEN (REMPLACER ('123a123a12', '1', ''));
--7 - Mauvais
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
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', ''))
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.
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', ''))