【问题标题】:Create table of counts for characters from table of strings为字符串表中的字符创建计数表
【发布时间】:2014-02-24 05:05:46
【问题描述】:

假设我有一个文本回复表:

ID   Responses  
1    Sample response goes here!!  
2    Another sample here...  
3    & another one here too! :)

返回如下表的最佳方式是什么:

Character   Count
!           3
&           1
:           1
.           3
a           4
s           5
char(10)    0

... (and so forth)

我是否必须创建一个包含所有可能的 SQL 字符的表,然后遍历一组文本响应?如果是这样,我在哪里可以找到所有可能的 SQL 字符的列表? (包括“char(10)”等特殊字符)

【问题讨论】:

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

不,你没有。列表存在并且它们很大。我不会指向你,因为你不需要它们。您可以创建表,然后一次解析一个字符并为每个字符“更新”数据库。或者您可以一次处理一行字符串并填充由字符索引的数组。完全解析字符串后,遍历数组并使用数组中的计数更新数据库。

upsert 是伪代码,意思是“查看该行是否存在,如果存在,更新它,如果不存在,插入它”。

一些数据库支持在一个语句中执行 upsert 的方法,但大多数不支持,您必须编写三个语句和一个 if。

【讨论】:

    【解决方案2】:

    你打算只计算 ASCII 字符还是 Unicode 字符?如果是前者,我会做一个看起来像这样的桌子......

        CREATE TABLE CharCounts
        (CharID int not null,
        CharCount bigint not null)
    

    第一列将保存字符的 ASCII 码(参见 t-sql 中的ASCII 函数)。第二列将保存实际计数。然后,您可以编写一个存储过程,利用 t-sql 中的各种字符串函数(ASCII、LEN、SUBSTRING)来计算计数。

    【讨论】:

      【解决方案3】:

      如果每个响应的最大长度很短,则效果很好。如果您正在处理 varchar(max) 和大字符串,SQL 可能不是最好的工具。

      ;WITH num AS (SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY (SELECT 0)) i FROM master..spt_values)
      SELECT
        ASCII(SUBSTRING(Response,i,1)) AS Character,
        COUNT(*) AS Count
      FROM Responses
      INNER JOIN num ON ASCII(SUBSTRING(Response,i,1)) IS NOT NULL
      GROUP BY ASCII(SUBSTRING(Response,i,1))
      ORDER BY ASCII(SUBSTRING(Response,i,1))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-21
        • 2016-02-13
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多