Просто имейте в виду, что если в строке больше «N» или «Y», это может быть неточно. См. Решение nickf для более надежного метода.
Tom H
319
Этот фрагмент работает в конкретной ситуации, когда у вас есть логическое значение: он отвечает «сколько там не-N?».
SELECT LEN(REPLACE(col,'N',''))
Если в другой ситуации вы действительно пытались подсчитать количество вхождений определенного символа (например, «Y») в любой заданной строке, используйте это:
Второй - лучший ответ здесь. Все остальное полагается на своеобразное положение строки, содержащей только два разных символа.
Стив Беннетт
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 будет удвоен.
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 zeroFROM[TableTo Search]
+1 Это усиливает второе предложение @nickf, так что оно фактически сообщит вам количество экземпляров строки, даже если строка, которую вы ищете, содержит более 1 символа,
Кевин Хайдт
Редактирование @domenicr нарушило этот ответ, и мое изменение было отклонено. Деление должно быть по LEN(@StringToFind).
Джейми Китсон
@jamiek извиняется. Я отправил исправленный код, но не знаю, почему ваше изменение было отклонено.
domenicr
@domenicr Вы должны вернуться к исходному коду, ваше редактирование бесполезно усложняет код, @StringToFindникогда не будет нулевым или пустым.
Джейми Китсон
@JamieKitson Я вижу иначе. Проверка деления на ноль - это принцип передовой практики. Кроме того, подсчет количества пробелов Field To Searchприведет к делению на ноль, потому что Len(' ')возвращает ноль.
domenicr
2
Может как то так ...
SELECT
LEN(REPLACE(ColumnName,'N',''))as NumberOfYs
FROM
SomeTable
Если вы хотите подсчитать количество экземпляров строк с более чем одним символом, вы можете либо использовать предыдущее решение с регулярным выражением, либо это решение использует STRING_SPLIT, который, как мне кажется, был введен в SQL Server 2016. Также вам понадобится совместимость уровень 130 и выше.
Второй ответ nickf очень умный. Однако он работает только для длины символа целевой подстроки 1 и игнорирует пробелы. В частности, в моих данных было два ведущих пробела, которые SQL любезно удаляет (я этого не знал), когда удаляются все символы с правой стороны. Что означало, что
" Джон Смит"
сгенерировано 12 с использованием метода Никфа, тогда как:
"Джо Блоггс, Джон Смит"
сгенерировано 10, и
«Джо Блоггс, Джон Смит, Джон Смит»
Создано 20.
Поэтому я немного изменил решение на следующее, которое мне подходит:
-- DECLARE field because your table type may be textDECLARE@mmRxClaim nvarchar(MAX)-- Getting Value from tableSELECTtop(1)@mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362-- Main String ValueSELECT@mmRxClaim AS MainStringValue
-- Count Multiple Character for this number of space will be number of characterSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'GS',' '))AS CountMultipleCharacter
-- Count Single Character for this number of space will be oneSELECT LEN(@mmRxClaim)- LEN(REPLACE(@mmRxClaim,'G',''))AS CountSingleCharacter
-- ================================================SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================-- Author: VIKRAM JAIN-- Create date: 20 MARCH 2019-- Description: Count char from string-- =============================================createFUNCTION vj_count_char_from_string
(@string nvarchar(500),@find_char char(1))
RETURNS integer
ASBEGIN-- Declare the return variable hereDECLARE@total_char int;DECLARE@position INT;SET@total_char=0;set@position =1;-- Add the T-SQL statements to compute the return value hereif LEN(@string)>0BEGINWHILE@position <= LEN(@string)-1BEGINif SUBSTRING(@string,@position,1)=@find_char
BEGINSET@total_char+=1;ENDSET@position+=1;ENDEND;-- Return the result of the functionRETURN@total_char;END
GO
Если вам нужно подсчитать символ в строке с более чем двумя видами символов, вы можете использовать вместо 'n' -некоторого оператора или регулярного выражения символов, принимающих нужный вам символ.
Вот что я использовал в Oracle SQL, чтобы узнать, передает ли кто-то правильно отформатированный номер телефона:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','')ISNULLAND
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', ''))
Ответы:
В SQL Server:
источник
Этот фрагмент работает в конкретной ситуации, когда у вас есть логическое значение: он отвечает «сколько там не-N?».
Если в другой ситуации вы действительно пытались подсчитать количество вхождений определенного символа (например, «Y») в любой заданной строке, используйте это:
источник
Это каждый раз давало мне точные результаты ...
Это в моем поле Stripes ...
Желтый, желтый, желтый, желтый, желтый, желтый, черный, желтый, желтый, красный, желтый, желтый, желтый, черный
источник
источник
LEN(@StringToFind)
.@StringToFind
никогда не будет нулевым или пустым.Field To Search
приведет к делению на ноль, потому чтоLen(' ')
возвращает ноль.Может как то так ...
источник
Самый простой способ - использовать функцию Oracle:
источник
Это вернет количество случаев N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table
источник
попробуй это
источник
Попробуй это. Это определяет нет. вхождений одиночных символов, а также вхождений подстроки в основной строке.
источник
Если вы хотите подсчитать количество экземпляров строк с более чем одним символом, вы можете либо использовать предыдущее решение с регулярным выражением, либо это решение использует STRING_SPLIT, который, как мне кажется, был введен в SQL Server 2016. Также вам понадобится совместимость уровень 130 и выше.
.
источник
Второй ответ nickf очень умный. Однако он работает только для длины символа целевой подстроки 1 и игнорирует пробелы. В частности, в моих данных было два ведущих пробела, которые SQL любезно удаляет (я этого не знал), когда удаляются все символы с правой стороны. Что означало, что
" Джон Смит"
сгенерировано 12 с использованием метода Никфа, тогда как:
"Джо Блоггс, Джон Смит"
сгенерировано 10, и
«Джо Блоггс, Джон Смит, Джон Смит»
Создано 20.
Поэтому я немного изменил решение на следующее, которое мне подходит:
Я уверен, что кто-то может придумать лучший способ сделать это!
источник
Вы также можете попробовать это
Вывод:
источник
Нижеприведенное решение помогает узнать, нет ли символов в строке с ограничением:
2) Попробуйте следующее решение для правильного вывода:
источник
Если вам нужно подсчитать символ в строке с более чем двумя видами символов, вы можете использовать вместо
'n' -
некоторого оператора или регулярного выражения символов, принимающих нужный вам символ.источник
Вот что я использовал в Oracle SQL, чтобы узнать, передает ли кто-то правильно отформатированный номер телефона:
Первая часть проверяет, содержит ли номер телефона только цифры и дефис, а вторая часть проверяет, имеет ли номер телефона только два дефиса.
источник
выберите len (name) - len (replace (name, 'a', '')) из ТЕСТИРОВАНИЯ
выберите len ('YYNYNYYNNNYYNY') - len (replace ('YYNYNYYNNNYYNY', 'y', ''))
источник