Как подсчитать количество символов в столбце SQL - PullRequest
92 голосов
/ 07 декабря 2009

У меня есть столбец SQL, который представляет собой строку из 100 символов «Y» или «N». Например:

YYNYNYYNNNYYNY ...

Какой самый простой способ получить количество всех символов Y в каждом ряду.

Ответы [ 15 ]

274 голосов
/ 07 декабря 2009

Этот фрагмент работает в конкретной ситуации, когда у вас есть логическое значение: он отвечает «сколько не-N есть?».

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

Если в другой ситуации вы на самом деле пытались посчитать вхождения определенного символа (например, «Y») в любую строку, используйте это:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
82 голосов
/ 07 декабря 2009

В SQL Server:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...
13 голосов
/ 17 февраля 2014
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]
13 голосов
/ 16 ноября 2012

Это дало мне точные результаты каждый раз ...

Это в моем поле Полос ... Желтый, желтый, желтый, желтый, желтый, желтый, черный, желтый, желтый, красный, желтый, желтый, желтый, черный

  • 11 желтых
  • 2 Черный
  • 1 красный
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts
3 голосов
/ 07 декабря 2009

Может быть, как-то так ...

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable
2 голосов
/ 27 апреля 2016

Самый простой способ - использовать функцию Oracle:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
1 голос
/ 20 марта 2019

Ниже приведено решение, позволяющее выяснить отсутствие символа в строке с ограничением:

1) с использованием SELECT LEN (REPLACE (myColumn, 'N', '')), но с ограничением и неправильный вывод в нижнем состоянии:

ВЫБРАТЬ ЛЕН (ЗАМЕНА ('YYNYNYYNNNYYNY', 'N', ''));
--8 - правильно

ВЫБРАТЬ ЛЕН (ЗАМЕНА ('123a123a12', 'a', ''));
--8 - Неправильно

ВЫБРАТЬ ЛЕН (ЗАМЕНА ('123a123a12', '1', ''));
--7 - Неправильно

2) Попробуйте с приведенным ниже решением для правильного вывода:

  • Создайте функцию, а также измените ее согласно требованию.
  • И вызов функции согласно ниже

выберите dbo.vj_count_char_from_string ('123a123a12', '2');
--2 - правильно

select dbo.vj_count_char_from_string ('123a123a12', 'a');
--2 - правильно

-- ================================================
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 голос
/ 20 апреля 2017

Вы также можете попробовать это

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

Выход:

enter image description here

1 голос
/ 14 октября 2016

Второй ответ, предоставленный Никфом, очень умный. Однако он работает только для длины символа целевой подстроки 1 и игнорирует пробелы. В частности, в моих данных было два пробела, которые SQL старательно удаляет (я этого не знал), когда удаляются все символы справа. Что означало, что

"Джон Смит"

сгенерировано 12 с использованием метода Никфа, тогда как:

"Джо Блоггс, Джон Смит"

сгенерировано 10, а

«Джо Блоггс, Джон Смит, Джон Смит»

Сгенерировано 20.

Поэтому я немного изменил решение до следующего, что мне подходит:

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

Я уверен, что кто-то может придумать лучший способ сделать это!

1 голос
/ 09 сентября 2016

Если вы хотите подсчитать количество экземпляров строк, содержащих более одного символа, вы можете использовать предыдущее решение с регулярным выражением, или это решение использует STRING_SPLIT, который, как я считаю, был представлен в SQL Server 2016. Также вы ' Вам понадобится уровень совместимости 130 и выше.

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