如何计算 SQL 列中的字符实例

我有一个 sql 列,它是一个包含100个‘ Y’或‘ N’字符的字符串:

YYNYNYYNNNYYNY...

获得每行中所有“ Y”符号的计数的最简单方法是什么。

404786 次浏览

在 SQLServer 中:

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

也许像这样的事..。

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

这个代码片段适用于有布尔值的特定情况: 它回答“有多少个非 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]

下面是我在 Oracle SQL 中用来查看某人是否传递了格式正确的电话号码:

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

第一部分检查电话号码是否只有数字和连字符,第二部分检查电话号码是否只有两个连字符。

试试这个

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

最简单的方法是使用 Oracle 函数:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

试试这个:

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 会帮助删除这两个前导空格(我不知道这一点)。也就是说

“约翰 · 史密斯”

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

产出:

enter image description here

例如,计算 SQL Column 中字符(a)的计数实例-> name is Column name “(在 doblequots 中是空的,我用 nocharecter@替换 a”)

从测试中选择 len (name)-len (place (name,‘ a’,”))

选择 len (‘ YYNYYNNNYYNY’)-len (替换(‘ YYNYYNNNYYNY’,‘ y’,”))

下面的解决方案有助于找出字符串中没有出现带有限制的字符:

1)使用 SELECT LEN (REPLACE (myColumn,’N’,”)) ,但限制和 在下列情况下输出错误:

选择 LEN (替换(‘ YYNYYNNYNY’,‘ N’,”) ;
——8——正确

选择 LEN (替换(’123a123a12’,‘ a’,”) ;
——8——错

选择 LEN (替换(’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

如果你需要计算一个字符串中超过2种字符的字符数,你可以使用一些操作符或者 正则表达式的字符来代替 'n' -来接受你需要的字符。

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

这将返回 N 的出现次数

Select ColumnName,LEN (ColumnName)-LEN (REPLACE (ColumnName,’N’,”)) 由表

DECLARE @char NVARCHAR(50);
DECLARE @counter INT = 0;
DECLARE @i INT = 1;
DECLARE @search NVARCHAR(10) = 'Y'
SET @char = N'YYNYNYYNNNYYNY';
WHILE @i <= LEN(@char)
BEGIN
IF SUBSTRING(@char, @i, 1) = @search
SET @counter += 1;


SET @i += 1;
END;


SELECT @counter;