Как подсчитать экземпляры символа в столбце SQL


111

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

YYNYNYYNNNYYNY ...

Самый простой способ подсчитать количество всех символов «Y» в каждой строке.


1
Можете указать платформу? MySQL, MSSQl, Oracle?
Винсент Рамдани,

Да - с Oracle кажется, что вам нужна длина, а не длина
JGFMK

Ответы:


96

В SQL Server:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...

18
Просто имейте в виду, что если в строке больше «N» или «Y», это может быть неточно. См. Решение nickf для более надежного метода.
Tom H

319

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

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

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

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))

32
Второй - лучший ответ здесь. Все остальное полагается на своеобразное положение строки, содержащей только два разных символа.
Стив Беннетт

5
Просто примечание: в T-SQL вам нужно использовать LEN, а не LENGTH.
Люк

4
Функция @nickf SQL len обрезает конечные пробелы, поэтому, если вы искали, сколько вхождений пробела в строке, скажем «Привет», вы получите 0. Самый простой способ - добавить конечный символ к строке раньше и настроить len как так. ВЫБРАТЬ LEN (col + '~') - LEN (REPLACE (col, 'Y', '') + '~')
domenicr

3
Если вас беспокоят конечные пробелы, используйте вместо этого функцию DATALENGTH.
StevenWhite

2
@StevenWhite DATALENGTH возвращает количество использованных байтов. Таким образом, NVARCHAR будет удвоен.
domenicr

18

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

Это в моем поле Stripes ...

Желтый, желтый, желтый, желтый, желтый, желтый, черный, желтый, желтый, красный, желтый, желтый, желтый, черный

  • 11 желтых
  • 2 Черный
  • 1 красный
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

Это очень хитрый способ! Спасибо
Тельт

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

+1 Это усиливает второе предложение @nickf, так что оно фактически сообщит вам количество экземпляров строки, даже если строка, которую вы ищете, содержит более 1 символа,
Кевин Хайдт

Редактирование @domenicr нарушило этот ответ, и мое изменение было отклонено. Деление должно быть по LEN(@StringToFind).
Джейми Китсон

@jamiek извиняется. Я отправил исправленный код, но не знаю, почему ваше изменение было отклонено.
domenicr

@domenicr Вы должны вернуться к исходному коду, ваше редактирование бесполезно усложняет код, @StringToFindникогда не будет нулевым или пустым.
Джейми Китсон

@JamieKitson Я вижу иначе. Проверка деления на ноль - это принцип передовой практики. Кроме того, подсчет количества пробелов Field To Searchприведет к делению на ноль, потому что Len(' ')возвращает ноль.
domenicr




0

попробуй это

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

0

Попробуй это. Это определяет нет. вхождений одиночных символов, а также вхождений подстроки в основной строке.

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

0

Если вы хотите подсчитать количество экземпляров строк с более чем одним символом, вы можете либо использовать предыдущее решение с регулярным выражением, либо это решение использует 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

0

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

" Джон Смит"

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

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

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

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

Создано 20.

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

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

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


0

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

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

Вывод:

введите описание изображения здесь


0

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

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

ВЫБЕРИТЕ LEN (REPLACE ('YYNYNYNNNYYNY', 'N', ''));
--8 - Правильно

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

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

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

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

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

выберите 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

0

Если вам нужно подсчитать символ в строке с более чем двумя видами символов, вы можете использовать вместо 'n' -некоторого оператора или регулярного выражения символов, принимающих нужный вам символ.

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

-1

Вот что я использовал в Oracle SQL, чтобы узнать, передает ли кто-то правильно отформатированный номер телефона:

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

Первая часть проверяет, содержит ли номер телефона только цифры и дефис, а вторая часть проверяет, имеет ли номер телефона только два дефиса.


Какое отношение этот вопрос имеет к номерам телефонов? Он также просит решение T-SQL ...
Бен

-1

например, для вычисления количества экземпляров символа (a) в столбце SQL -> имя - это имя столбца '' (а в doblequote пусто, я заменяю a на nocharecter @ '')

выберите len (name) - len (replace (name, 'a', '')) из ТЕСТИРОВАНИЯ

выберите len ('YYNYNYYNNNYYNY') - len (replace ('YYNYNYYNNNYYNY', 'y', ''))

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.