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


111

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

YYNYNYYNNNYYNY ...

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


1
您可以指定平台吗?MySQL,MSSQl,Oracle?
Vincent Ramdhanie,2009年

是的-使用Oracle似乎需要长度-而不是len
JGFMK

Answers:


96

在SQL Server中:

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

18
请注意,如果字符串中的字符数超过“ N”或“ Y”,则可能不准确。有关更可靠的方法,请参见nickf解决方案。
汤姆H 2009年

319

此代码段在特定的情况下有效(您有一个布尔值):它回答“有多少个非N?”。

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

如果在另一种情况下,您实际上是在尝试计算给定字符串中某个字符(例如“ Y”)的出现次数,请使用以下命令:

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

32
第二个是最好的答案。所有其余部分都依赖于仅包含两个不同字符的字符串的特殊情况。
史蒂夫·本内特

5
请注意:在T-SQL中,您需要使用LEN而不是LENGTH。
路加福音

4
@nickf SQL len函数会修剪尾部空格,因此,如果您正在查找字符串中出现多少空格,我们说“ Hello”,您将得到0。最简单的方法是在字符串之前添加尾部字符,然后像所以。SELECT LEN(col +'〜')-LEN(REPLACE(col,'Y',``)+'〜')
domenicr

3
如果您担心尾随空格,请改用DATALENGTH函数。
StevenWhite

2
@StevenWhite DATALENGTH返回使用的字节数。因此NVARCHAR将加倍。
domenicr

18

每次给我准确的结果...

这是在我的“条纹”字段中...

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

  • 11黄
  • 2黑色
  • 1红
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts

这是一个非常聪明的方法!谢谢
Thelt

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

+1这会增强@nic​​kf的第二个建议,以便即使您要查找的字符串超过1个字符,它也会实际上告诉您字符串的实例数
Kevin Heidt 2014年

@domenicr的编辑破坏了这个答案,我的编辑被拒绝了。除法应为LEN(@StringToFind)
杰米·基特森

@jamiek道歉,我已提交更正的代码,但不知道为什么您的编辑被拒绝。
domenicr 2015年

@domenicr您应该恢复到原始代码,您的编辑使代码变得毫无用处,@StringToFind永远不会为null或为空。
杰米·基特森

@JamieKitson我不这么认为。检查除以零是最佳实践的原则。同样,计算中的空格数Field To Search将得到零除,因为它Len(' ')返回零。
domenicr 2015年

2

也许是这样的...

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

1

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

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME


0

试试这个

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

0

试试这个。它确定了编号。单字符出现以及主字符串中的子字符串出现。

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

0

如果要计算一个字符以上的字符串的实例数,则可以将以前的解决方案与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

0

nickf提供的第二个答案非常聪明。但是,它仅适用于目标子字符串1的字符长度,并且会忽略空格。具体来说,我的数据中有两个前导空格,当删除了右侧的所有字符时,SQL会帮助删除(我不知道)。这意味着

“ 约翰·史密斯”

使用Nickf方法生成了12,而:

“乔·博格斯,约翰·史密斯”

产生10,并且

“乔·博格斯,约翰·史密斯,约翰·史密斯”

产生了20。

因此,我对解决方案做了些微修改,使其适用于我:

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

我敢肯定有人会想到一种更好的方法!


0

您也可以尝试一下

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

输出:

在此处输入图片说明


0

以下解决方案可帮助您从有限制的字符串中找出不存在的字符:

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

0

如果您需要用超过2种字符来计算字符串中的字符,则可以使用代替'n' -某些运算符或正则表达式的字符来接受所需的字符。

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

-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

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


这个问题与电话号码有什么关系?它也要求一个T-SQL的解决方案...

-1

例如计算SQL列中字符(a)的计数实例-> name是列名''(并且在doblequote中为空,我用nocharecter @''替换a)

从测试中选择len(name)-len(replace(name,'a',''))

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.