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

如何计算SQL列中字符的实例数,sql,string,tsql,count,symbols,Sql,String,Tsql,Count,Symbols,我有一个sql列,它是由100个“Y”或“N”字符组成的字符串。例如: YYNYNYNYNYNY 获取每行中所有“Y”符号计数的最简单方法是什么。在SQL Server中: SELECT LEN(REPLACE(myColumn, 'N', '')) FROM ... 也许是这样的 SELECT LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs FROM SomeTable 此代码段适用于具有布尔值的特定情况:它回答“有多少个非

我有一个sql列,它是由100个“Y”或“N”字符组成的字符串。例如:

YYNYNYNYNYNY

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

在SQL Server中:

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

也许是这样的

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

此代码段适用于具有布尔值的特定情况:它回答“有多少个非N?”

如果在另一种情况下,您实际上试图统计某个字符(例如“Y”)在任何给定字符串中的出现次数,请使用以下方法:

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

这给了我每次准确的结果

这是在我的领域

黄,黄,黄,黄,黄,黄,黑,黄,黄,黄,红,黄,黄,黄,黄,黑

  • 11黄色
  • 2黑色
  • 1红色

以下是我在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);
选择计数(解码(SUBSTR(上部(:main_字符串)、行数、长度(:search_char))、上部(:search_char)、1))搜索字符计数
来自双重

按rownum连接如果要计算包含多个字符的字符串实例的数量,可以使用以前的解决方案和regex,或者此解决方案使用STRING_SPLIT,我相信这是SQL Server 2016中引入的。此外,您还需要兼容级别130及更高

ALTER DATABASE [database_name] SET COMPATIBILITY_LEVEL = 130


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
输出:

例如,计算SQL Column->name is Column name中字符(a)的计数实例 ''(在doblequote's is empty中,我将a替换为NoSharecter@')

从测试中选择len(名称)-len(替换(名称,'a','')


选择len('yynnynnyny')-len(替换('yynnynnyny','y','')

下面的解决方案帮助可从具有限制的字符串中查找不存在的字符:

1) 使用SELECT LEN(替换(myColumn,'N',''),但限制和 以下情况下输出错误:

选择LEN(替换('yynynnyny','N','')
--8--对

选择LEN(替换('123a123a12','a','')
--8--错了

选择LEN(替换('123a123a12','1','')
--7--错了

2) 尝试以下解决方案以获得正确的输出:

  • 创建一个函数,并根据需要进行修改
  • 并调用如下所示的函数
从字符串('123a123a12','2')中选择dbo.vj_count_char_
--2--对

从字符串('123a123a12','a')中选择dbo.vj_count_char_
--2--对

——================================================
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
-- =============================================
--作者:VIKRAM JAIN
--创建日期:2019年3月20日
--描述:从字符串中计数字符
-- =============================================
从字符串创建函数vj_count_char_
(
@字符串nvarchar(500),
@查找字符(1)
)
返回整数
作为
开始
--在这里声明返回变量
声明@total_char int;声明@positionint;
设置@total_char=0;设置@position=1;
--在此处添加T-SQL语句以计算返回值
如果LEN(@string)>0
开始

而@position如果需要在一个包含两种以上字符的字符串中计算字符,则可以使用字符的
'n'-
某些运算符或正则表达式来接受所需的字符

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

这将返回N的发生次数

选择ColumnName,LEN(ColumnName)-LEN(替换(ColumnName,'N','')

从表

可以指定平台吗?MySQL、MSSQl、Oracle?是的-对于Oracle,您似乎需要长度-但请注意,如果字符串中的长度超过“N”或“Y”,则这可能是不准确的。请参阅nickf的解决方案,了解更稳健的方法。第二种方法是这里的最佳答案。其余的都取决于只包含两个不同字符的字符串的特殊情况。请注意:在T-SQL中,您需要使用LEN而不是LENGTH。@nickf SQL LEN函数修剪尾随空格,因此如果您要查找字符串中空格的出现次数,让我们说“Hello”,您将得到0。最简单的方法是在前面的字符串中添加一个尾随字符,然后像这样调整len。选择LEN(col+“~”)-LEN(REPLACE(col,'Y','')+“~”)如果您关心尾随空格,请改用DATALENGTH函数。@StevenWhite DATALENGTH返回使用的字节数。因此NVARCHAR将加倍。+1这增强了@nickf的第二个建议,因此它实际上会告诉您字符串的实例数,即使您要查找的字符串超过1character@domenicr的编辑已破坏此答案,我的编辑被拒绝。除法应为
LEN(@StringToFind)
@jamiek抱歉,我已提交了更正的代码,但不知道您的编辑被拒绝的原因。@domenicr您应该恢复到原始代码,您的编辑毫无目的地使代码复杂化,
@S
--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
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
-- ================================================
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
SELECT LEN(REPLACE(col, 'N', ''))