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

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

YYNYNYYNNNYYNY …

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

если ms sql

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

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

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

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

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

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

Это в моем поле Полосы … Желтый, Желтый, Желтый, Желтый, Желтый, Желтый, Черный, Желтый, Желтый, Красный, Желтый, Желтый, Желтый, Черный

  • 11 Желтые
  • 2 Черный
  • 1 Красный
 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] 

Может быть, что-то вроде этого …

 SELECT LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs FROM SomeTable 

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

 SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME 

попробуй это

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

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

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

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

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

" Джон Смит"

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

«Джо Bloggs, Джон Смит»

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

«Джо Bloggs, Джон Смит, Джон Смит»

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

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

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

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

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

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

Вывод:

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

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

выберите len (name) – len (заменить (имя, 'a', '')) из TESTING

выберите len («YYNYYYYNNNYYNYY») – len (заменить («YYNYYYNNNNYYYYYY», 'y', ''))

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

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

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