Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer中计算字符串的所有三元数_Sql_Sql Server 2008 - Fatal编程技术网

如何在SQLServer中计算字符串的所有三元数

如何在SQLServer中计算字符串的所有三元数,sql,sql-server-2008,Sql,Sql Server 2008,我想计算并计算SQL Server中字符串的所有三角形 例如,如果字符串为hello,我希望得到以下输出: Trigram Count ------- ----- hel 1 ell 1 llo 1 lo- 1 我仍然不知道n-gram是什么,但根据Ed的回答,这就是你需要的吗 declare @string varchar(max) = 'hello' declare @n int = 3 set @string = @string + REPLICATE('

我想计算并计算SQL Server中字符串的所有三角形

例如,如果字符串为hello,我希望得到以下输出:

Trigram Count ------- ----- hel 1 ell 1 llo 1 lo- 1
我仍然不知道n-gram是什么,但根据Ed的回答,这就是你需要的吗

declare @string varchar(max) = 'hello'
declare @n int = 3

set @string = @string + REPLICATE('-',@n - (len(@string) % @n))

;with n as
(
SELECT 1 AS i
UNION ALL
SELECT i+1 
FROM n
WHERE i <= (LEN(@string)-@n)
)
select SUBSTRING(@string, i, @n), COUNT(*)
from n
group by  SUBSTRING(@string, i, @n)
option (maxrecursion 0)

根据Martin Smith的回答,添加了一个逻辑,将字符串填充为可被3整除的字符数

declare @string varchar(max) = 'hello'

SET @string = (SELECT CASE LEN(@string) % 3
                          WHEN 1 THEN @string + '--'
                          WHEN 2 THEN @string + '-'
                          ELSE @string
                      END )
;with n as
(
SELECT 1 AS i
UNION ALL
SELECT i+1 
FROM n
WHERE i < (LEN(@string)-2)
)
select SUBSTRING(@string, i, 3) AS Trigram, COUNT(*) AS Count
from n
group by  SUBSTRING(@string, i, 3)
option (maxrecursion 0)

借用Ed和Martin的话,我认为这是一个正确的实现:

declare @string varchar(max) = 'here kitty kitty' 

SET @string = replace(@string, ' ', '-') --Wikipedia says this should be underscore, not dash
;with n as 
( 
    SELECT 1 AS i 
    UNION ALL 
    SELECT i + 1  
    FROM n 
    WHERE i < (LEN(@string)-2) 
) 
select SUBSTRING(@string, i, 3) AS Trigram, COUNT(*) AS Count 
from n 
group by SUBSTRING(@string, i, 3) 
option (maxrecursion 0) 

请给出示例输入和所需输出。lo-必须是输出的一部分。我的问题是为什么?i、 你能更好地为那些不知道三叉戟是什么的人解释一下吗。。。。对于那些懒得读维基百科文章的人来说。Ed的解释正确吗?根据我的理解,下划线等于空格字符,因此如果输入字符串中没有空格,则不应出现下划线。在输入中用下划线替换所有空格应该可以。我不知道这是否正确,但是+1。你读过维基百科的文章吗?编辑:我明白了!我读了简明的三角图页。此算法提供与该页面相同的输出。