Answers:
此代码段在特定的情况下有效(您有一个布尔值):它回答“有多少个非N?”。
SELECT LEN(REPLACE(col, 'N', ''))
如果在另一种情况下,您实际上是在尝试计算给定字符串中某个字符(例如“ Y”)的出现次数,请使用以下命令:
SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
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]
LEN(@StringToFind)
。
@StringToFind
永远不会为null或为空。
Field To Search
将得到零除,因为它Len(' ')
返回零。
最简单的方法是使用Oracle函数:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
这将返回N的出现次数
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
试试这个。它确定了编号。单字符出现以及主字符串中的子字符串出现。
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);
如果要计算一个字符以上的字符串的实例数,则可以将以前的解决方案与regex一起使用,或者此解决方案使用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会帮助删除(我不知道)。这意味着
“ 约翰·史密斯”
使用Nickf方法生成了12,而:
“乔·博格斯,约翰·史密斯”
产生10,并且
“乔·博格斯,约翰·史密斯,约翰·史密斯”
产生了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-正确SELECT LEN(REPLACE('123a123a12','a',``)));
--8-错SELECT LEN(REPLACE('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
这是我在Oracle SQL中使用的用于查看是否有人传递了格式正确的电话号码的方法:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2
第一部分检查电话号码是否只有数字和连字符,第二部分检查电话号码只有两个连字符。