从字符串表中创建字符计数表

时间:2014-02-20 18:52:23

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

说我有一个文本回复表:

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)”这样的特殊字符)

3 个答案:

答案 0 :(得分:1)

不,不。这些清单存在且非常庞大。我不会指出你,因为你不需要它们。您可以创建表,然后一次解析一个字符的字符串,并为每个字符“upsert”数据库。或者,您可以一次处理一行字符串并填充由该字符索引的数组。完全解析字符串后,遍历数组并使用数组中的计数向上插入数据库。

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

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

答案 1 :(得分:0)

您是仅计算ASCII字符还是Unicode字符?如果它是前者,我会制作一张看起来像这样的桌子......

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

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

答案 2 :(得分:0)

如果每个响应的最大长度很小,则效果非常好。如果您正在处理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))