【问题标题】: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))