У меня есть столбец sql, который представляет собой строку из 100 символов 'Y' или 'N'. Например:
YYNYNYYNNNYYNY...
Каков самый простой способ получить количество всех символов "Y" в каждой строке.
У меня есть столбец sql, который представляет собой строку из 100 символов 'Y' или 'N'. Например:
YYNYNYYNNNYYNY...
Каков самый простой способ получить количество всех символов "Y" в каждой строке.
В SQL Server:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
Этот фрагмент работает в конкретной ситуации, где у вас есть логическое значение: он отвечает "сколько не-N есть?".
SELECT LEN(REPLACE(col, 'N', ''))
Если в другой ситуации вы на самом деле пытались подсчитать вхождения определенного символа (например, "Y") в любую строку, используйте это:
SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
Это дало мне точные результаты каждый раз...
Это в моем поле Полосы...
Желтый, желтый, желтый, желтый, желтый, желтый, черный, желтый, желтый, красный, желтый, желтый, желтый, черный
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
Вывод:
Приведенное ниже решение поможет выяснить отсутствие символа в строке с ограничением:
1) использование SELECT LEN (REPLACE (myColumn, 'N', '')), но ограничение и неправильный вывод в следующих условиях:
SELECT LEN (REPLACE ('YYNYNYYNNNYYNY', '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
Если вам нужно посчитать символ в строке с более чем двумя типами символов, вы можете использовать вместо 'n' -
какой-либо оператор или регулярное выражение символов принимают нужный вам символ.
SELECT LEN(REPLACE(col, 'N', ''))
Это вернет номер вхождения N
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
Вот что я использовал в Oracle SQL, чтобы узнать, прошел ли кто-то правильно отформатированный номер телефона:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2
Первая часть проверяет, имеет ли номер телефона только номера, а дефис и вторая часть проверяют, чтобы номер телефона имел только два дефиса.
например, для вычисления экземпляров count символа (a) в столбце SQL → name - имя столбца '' (и в doblequote пусто, я заменяю nocharecter @'')
выберите len (name) - len (replace (name, 'a', '')) из TESTING
выберите len ( "YYNYYYYNNNNYYYYY" ) - len (заменить ( "YYNYYYNNNNYYYYYY", "y ',' '))