说我有一个文本回复表:
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)”这样的特殊字符)
答案 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))