【问题标题】:How to count instances of character in SQL Column如何计算 SQL 列中的字符实例
【发布时间】:2010-12-24 01:05:39
【问题描述】:

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

YYNYNYYNNNYYNY...

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

【问题讨论】:

  • 你能指定平台吗? MySQL、MSSQl、Oracle?
  • 是的 - 使用 Oracle 似乎你需要长度 - 而不是 len

标签: sql string tsql count symbols


【解决方案1】:

这个 sn-p 适用于你有一个布尔值的特定情况:它回答“有多少个非 N?”。

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

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

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

【讨论】:

  • 第二个是最好的答案。其余的都依赖于仅包含两个不同字符的字符串的特殊情况。
  • 请注意:在 T-SQL 中,您需要使用 LEN 而不是 LENGTH。
  • @nickf SQL len 函数会修剪尾随空格,因此如果您要查找字符串中空格出现的次数,可以说“Hello”,您将得到 0。最简单的方法是添加尾随字符到之前的字符串并像这样调整len。 SELECT LEN(col + '~') - LEN(REPLACE(col, 'Y', '') + '~')
  • 如果您担心尾随空格,请改用 DATALENGTH 函数。
  • @StevenWhite DATALENGTH 返回使用的字节数。所以 NVARCHAR 会加倍。
【解决方案2】:

在 SQL Server 中:

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

【讨论】:

  • 请注意,如果字符串中有多个“N”或“Y”,那么这可能是不准确的。请参阅 nickf 的解决方案以获得更强大的方法。
【解决方案3】:

这每次都给了我准确的结果...

这是在我的 Stripes 字段中...

黄、黄、黄、黄、黄、黄、黑、黄、黄、红、黄、黄、黄、黑

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

【讨论】:

    【解决方案4】:
    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 的第二个建议,即使您要查找的字符串超过 1 个字符,它也会实际告诉您字符串的实例数
    • @domenicr 的编辑破坏了这个答案,我的编辑被拒绝了。该部门应由LEN(@StringToFind)
    • @jamiek 道歉我已经提交了更正的代码,但不知道为什么您的编辑被拒绝了。
    • @domenicr 您应该恢复到原始代码,您的编辑会使代码变得毫无意义,@StringToFind 永远不会为空或为空。
    • @JamieKitson 我不这么认为。检查除以零是最佳实践的原则。此外,计算Field To Search 中的空格数将得到除以零,因为Len(' ') 返回零。
    【解决方案5】:

    这将返回 N 的出现次数

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

    【讨论】:

      【解决方案6】:

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

      SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
      

      【讨论】:

        【解决方案7】:

        也许是这样的......

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

        【讨论】:

          【解决方案8】:

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

          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) 尝试以下解决方案以获得正确的输出:

          • 创建一个函数并根据需要进行修改。
          • 并调用如下函数

          select dbo.vj_count_char_from_string('123a123a12','2');
          --2 --正确

          select 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
          

          【讨论】:

            【解决方案9】:

            试试这个

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

            【讨论】:

              【解决方案10】:

              如果您想计算包含多个字符的字符串实例的数量,您可以使用以前的正则表达式解决方案,或者此解决方案使用 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
              

              【讨论】:

                【解决方案11】:

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

                “约翰·史密斯”

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

                “乔·布洛格斯,约翰·史密斯”

                生成 10,并且

                “乔·布洛格斯,约翰·史密斯,约翰·史密斯”

                生成 20 个。

                因此,我将解决方案稍微修改为以下,这对我有用:

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

                我相信有人能想到更好的方法!

                【讨论】:

                  【解决方案12】:

                  你也可以试试这个

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

                  输出:

                  【讨论】:

                    【解决方案13】:

                    如果您需要计算具有 2 种以上字符的字符串中的字符,您可以使用而不是 'n' - 一些运算符或 regex 字符接受您需要的字符。

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

                    【讨论】:

                      【解决方案14】:

                      试试这个:

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

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

                      【讨论】:

                        【解决方案15】:

                        这是我在 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 解决方案...
                        【解决方案16】:

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

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

                        选择 len('YYNYNYYNNNYYNY')- len(replace('YYNYNYYNNNYYNY','y',''))

                        【讨论】:

                          【解决方案17】:
                          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;
                          

                          【讨论】:

                          • 您好,如果您能解释一下您的代码的作用,那就太好了。它确实使我们其他人的答案更好,更容易理解!
                          • 嗨,我认为它会计算带有循环的字符串中的特定字符。如果当前字符等于我们要搜索的字符,它将向计数器加一,直到循环结束。问题中的示例是计算字符串中的 Y,即 8。
                          猜你喜欢
                          • 2013-01-04
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-04-24
                          • 1970-01-01
                          • 1970-01-01
                          • 2023-02-09
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多