153

I have an sql column that is a string of 100 'Y' or 'N' characters. For example:

YYNYNYYNNNYYNY...

What is the easiest way to get the count of all 'Y' symbols in each row.

gotqn
  • 42,737
  • 46
  • 157
  • 243
cindi
  • 4,571
  • 8
  • 31
  • 38

17 Answers17

412

This snippet works in the specific situation where you have a boolean: it answers "how many non-Ns are there?".

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

If, in a different situation, you were actually trying to count the occurrences of a certain character (for example 'Y') in any given string, use this:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
Luke Girvin
  • 13,221
  • 9
  • 64
  • 84
nickf
  • 537,072
  • 198
  • 649
  • 721
  • 40
    The second one is the best answer here. All the rest rely on the peculiar situation of the string containing only two different characters. – Steve Bennett Jan 17 '13 at 01:05
  • 5
    Just a note: in T-SQL, you'll need to use LEN rather than LENGTH. – Luke Jul 30 '13 at 15:51
  • 4
    @nickf SQL len function trims trailing spaces so if you were looking for how many occurrences of a space within a string let's say 'Hello ' you would get 0. Easiest way would be to add a trailing character to the string before and adjust len like so. SELECT LEN(col + '~') - LEN(REPLACE(col, 'Y', '') + '~') – domenicr Sep 23 '15 at 18:10
  • 3
    If you're concerned about trailing spaces, use the DATALENGTH function instead. – StevenWhite Nov 10 '15 at 17:02
  • 2
    @StevenWhite DATALENGTH returns number of bytes used. So NVARCHAR will be doubled. – domenicr Nov 20 '15 at 20:54
  • In order to make this work case insensitive, lowercase the col and value, in this case being 'Y' – Gregory R. Jul 06 '20 at 21:55
111

In SQL Server:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
David Hedlund
  • 128,221
  • 31
  • 203
  • 222
  • 20
    Just be aware that if there are more than "N" or "Y" in the string then this could be inaccurate. See nickf's solution for a more robust method. – Tom H Dec 07 '09 at 15:28
32

This gave me accurate results every time...

This is in my Stripes field...

Yellow, Yellow, Yellow, Yellow, Yellow, Yellow, Black, Yellow, Yellow, Red, Yellow, Yellow, Yellow, Black

  • 11 Yellows
  • 2 Black
  • 1 Red
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts
Ron Sell
  • 331
  • 3
  • 3
15
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]
domenicr
  • 352
  • 3
  • 14
Aaron Dake
  • 179
  • 1
  • 5
  • +1 This enhances the second suggestion by @nickf so that it will actually tell you the number of instances of a string even if the string you're looking for is more than 1 character – Kevin Heidt Mar 06 '14 at 15:29
  • @domenicr's edit has broken this answer and my edit was rejected. The division should be by `LEN(@StringToFind)`. – Jamie Kitson Nov 19 '15 at 12:34
  • @jamiek apologies I have submitted corrected code, but don't know why your edit was rejected. – domenicr Nov 20 '15 at 20:39
  • @domenicr You should revert to the original code, your edit complicates the code to no purpose, `@StringToFind` is never going to be null or empty. – Jamie Kitson Nov 25 '15 at 12:43
  • @JamieKitson I see otherwise. Checking for a division by zero is a principle of best practices. Also, counting the number of spaces in `Field To Search` would get a division by zero because `Len(' ')` returns zero. – domenicr Nov 25 '15 at 19:11
  • @domenicr So switch to `DATALENGTH`. KISS. – Jamie Kitson Nov 26 '15 at 10:14
  • @JamieKitson `DATALENGTH` returns number of bytes used. So this code will break if you use UNICODE characters. Looks simple to me. – domenicr Nov 26 '15 at 14:47
13

This will return number of occurance of N

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

Faisal Shahzad
  • 170
  • 1
  • 4
4

The easiest way is by using Oracle function:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
itzmebibin
  • 9,199
  • 8
  • 48
  • 62
2

Maybe something like this...

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable
Restore the Data Dumps
  • 38,967
  • 12
  • 96
  • 122
1

Below solution help to find out no of character present from a string with a limitation:

1) using SELECT LEN(REPLACE(myColumn, 'N', '')), but limitation and wrong output in below condition:

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

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

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

2) Try with below solution for correct output:

  • Create a function and also modify as per requirement.
  • And call function as per below

select dbo.vj_count_char_from_string('123a123a12','2');
--2 --Correct

select 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
Vikram Jain
  • 5,498
  • 1
  • 19
  • 31
0

try this

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

Try this:

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

It determines the number of single character occurrences as well as the sub-string occurrences in main string.

KAI
  • 7
  • 2
0

If you want to count the number of instances of strings with more than a single character, you can either use the previous solution with regex, or this solution uses STRING_SPLIT, which I believe was introduced in SQL Server 2016. Also you’ll need compatibility level 130 and higher.

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
user3469285
  • 181
  • 1
  • 1
  • 9
0

The second answer provided by nickf is very clever. However, it only works for a character length of the target sub-string of 1 and ignores spaces. Specifically, there were two leading spaces in my data, which SQL helpfully removes (I didn't know this) when all the characters on the right-hand-side are removed. Which meant that

" John Smith"

generated 12 using Nickf's method, whereas:

" Joe Bloggs, John Smith"

generated 10, and

" Joe Bloggs, John Smith, John Smith"

Generated 20.

I've therefore modified the solution slightly to the following, which works for me:

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

I'm sure someone can think of a better way of doing it!

Statsanalyst
  • 331
  • 2
  • 3
  • 16
0

If you need to count the char in a string with more then 2 kinds of chars, you can use instead of 'n' - some operator or regex of the chars accept the char you need.

SELECT LEN(REPLACE(col, 'N', ''))
Saurabh Bhandari
  • 2,438
  • 4
  • 26
  • 33
-1

You can also Try This

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

Output:

enter image description here

Mohammad Atiour Islam
  • 5,380
  • 3
  • 43
  • 48
-2

for example to calculate the count instances of character (a) in SQL Column ->name is column name '' ( and in doblequote's is empty i am replace a with nocharecter @'')

select len(name)- len(replace(name,'a','')) from TESTING

select len('YYNYNYYNNNYYNY')- len(replace('YYNYNYYNNNYYNY','y',''))

-2
DECLARE @char NVARCHAR(50);
DECLARE @counter INT = 0;
DECLARE @i INT = 1;
DECLARE @search NVARCHAR(10) = 'Y'
    SET @char = N'YYNYNYYNNNYYNY';
    WHILE @i <= LEN(@char)
     BEGIN
        IF SUBSTRING(@char, @i, 1) = @search
            SET @counter += 1;

        SET @i += 1;
     END;

     SELECT @counter;
ashkanyo
  • 81
  • 6
  • 1
    Hi, it would be great if you could explain what your code does. It does make your answer a lot better and easier to understand for the rest of us! – Simas Joneliunas Jan 20 '22 at 07:11
  • Hi, I think it counts a specific character in a string with a loop. if the current character equals the character we want to search it adds one to the counter until the loop ends. the example in the question was to count the Ys in the string which is 8. – ashkanyo Jan 21 '22 at 14:08
-3

Here's what I used in Oracle SQL to see if someone was passing a correctly formatted phone number:

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

The first part checks to see if the phone number has only numbers and the hyphen and the second part checks to see that the phone number has only two hyphens.

Ben
  • 51,770
  • 36
  • 127
  • 149
TonyK
  • 17
  • 1
  • What does this question have to do with phone numbers? It's also asking for a T-SQL solution... – Ben Feb 05 '15 at 20:59