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

158

我有一个 SQL 列,它是一个包含 100 个 'Y' 或 'N' 字符的字符串。例如:

YYNYNYYNNNYYNY...

最简单的方法是如何获取每行中所有 'Y' 符号的计数。


2
你能指定平台吗?MySQL、MSSQL、Oracle? - Vincent Ramdhanie
1
是的 - 在使用Oracle时,似乎需要使用length而不是len。 - JGFMK
17个回答

420

这段代码适用于特定情况,当你有一个布尔值时,它会回答“有多少非N的元素?”。

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

如果在另一种情况下,您实际上是要计算给定字符串中某个特定字符(例如 'Y')的出现次数,请使用以下代码:

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

40
最佳答案是第二个。其余的答案都依赖于字符串仅包��两个不同字符这种特殊情况。 - Steve Bennett
5
注意:在 T-SQL 中,您需要使用 LEN 而不是 LENGTH。 - Luke
4
@nickf SQL 的 len 函数会删除尾随空格,因此如果您想查找字符串中空格的出现次数,比如 'Hello ',您将得到 0。最简单的方法是在字符串末尾添加一个字符,并相应地调整 len,如下所示。 SELECT LEN(col + '') - LEN(REPLACE(col, 'Y', '') + '') - domenicr
3
如果您担心尾随空格,请改用DATALENGTH函数。 - StevenWhite
2
@StevenWhite DATALENGTH 返回使用的字节数。因此,NVARCHAR 将会加倍。 - domenicr
为了使其不区分大小写,将列和值变为小写,在这种情况下是“Y”。 - Gregory R.

111
在SQL Server中:
SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...

20
请注意,如果字符串中有超过“N”或“Y”的数量,则结果可能不准确。请查看nickf的解决方案以获取更稳健的方法。 - Tom H

32

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

这是在我的条纹范围内...

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

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

16
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 这个增强了 @nickf 的第二个建议,这样即使你要查找的字符串超过一个字符,它也能告诉你该字符串的实例数量。 - Kevin Heidt
@domenicr的编辑破坏了这个答案,而我的编辑被拒绝了。应该将除法运算符改为LEN(@StringToFind) - Jamie Kitson
@jamiek 抱歉,我已经提交了更正后的代码,但不知道为什么你的编辑被拒绝了。 - domenicr
@domenicr 你应该回退到原始代码,你的修改没有任何意义地使代码变得复杂,@StringToFind 永远不会为 null 或空。 - Jamie Kitson
@domenicr 所以改用 DATALENGTH。保持简单。 - Jamie Kitson
显示剩余2条评论

13

这将返回N出现的次数

select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table


4
最简单的方法是使用Oracle函数:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME

2
也许是这样的……
SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable

1
以下解决方案可以帮助查找字符串中的字符数,并带有限制:
1) 使用SELECT LEN(REPLACE(myColumn, 'N', '')),但是在以下情况下有限制和错误的输出:
SELECT LEN(REPLACE('YYNYNYYNNNYYNY', 'N', ''));--8 --Correct SELECT LEN(REPLACE('123a123a12', 'a', ''));--8 --Wrong SELECT LEN(REPLACE('123a123a12', '1', ''));--7 --Wrong
2) 尝试使用以下解决方案获得正确的输出: - 创建一个函数并根据需要进行修改。 - 按以下方式调用函数。
select dbo.vj_count_char_from_string('123a123a12','2');--2 --Correct select dbo.vj_count_char_from_string('123a123a12','a');--2 -- Correct
-- ================================================
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

试一下这个

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

它确定主字符串中单个字符出现的次数以及子字符串出现的次数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接