Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql server SQL字符串:计算字符串中的单词数_Sql Server_String - Fatal编程技术网

Sql server SQL字符串:计算字符串中的单词数

Sql server SQL字符串:计算字符串中的单词数,sql-server,string,Sql Server,String,我在这里搜索了很多问题,但我找到的所有合理答案都是针对不同的语言,如Javascript等 我在SQL中有一个简单的任务,我似乎找不到一个简单的方法来完成。 我只需要计算SQL字符串(一个句子)中的“单词”数。你可以在我的例子中看到为什么“单词”被引用。“单词”由空格分隔 例句: 1. I am not your father. 2. Where are your brother,sister,mother? 3. Where are your brother, sister and mothe

我在这里搜索了很多问题,但我找到的所有合理答案都是针对不同的语言,如Javascript等

我在SQL中有一个简单的任务,我似乎找不到一个简单的方法来完成。 我只需要计算SQL字符串(一个句子)中的“单词”数。你可以在我的例子中看到为什么“单词”被引用。“单词”由空格分隔

例句:

1. I am not your father.
2. Where are your brother,sister,mother?
3. Where are your brother, sister and mother?
4. Who are     you?
期望的答案:

1. 5
2. 4
3. 7
4. 3
如你所见,我需要计算“单词”,而不考虑符号(我必须将它们视为单词的一部分)。因此,在样本2中:
(1)你的兄弟、姐妹、母亲在哪里4

我可以通过这样的替换来处理多个空格:
REPLACE(字符串“”,“”)->将2个空格替换为1
将(字符串、、“”)->3个空格替换为1,依此类推。


我可以使用什么SQL函数来执行此操作?我使用SQL Server 2012,但需要一个在SQL Server 2008中也能工作的函数。

以下是一种方法:

创建并填充示例表(请在以后的问题中保存此步骤)

使用cte将多个空间替换为单个空间(感谢的回答)

结果:

id  CountWords
1   5
2   4
3   7
4   3

这是@ZoharPeled答案的一个小改进。这也可以处理0个长度值:

DECLARE @t AS TABLE(id int identity(1,1), string varchar(100))

INSERT INTO @t VALUES
  ('I am not your father.'),
  ('Where are your brother,sister,mother?'),
  ('Where are your brother, sister and mother?'),
  ('Who are     you?'),
  ('')

;WITH CTE AS
(
  SELECT
    Id,
    REPLACE(REPLACE(string,' ', '><'), '<>', '') string
  FROM @t
)
SELECT 
  id,
  LEN(' '+string)-LEN(REPLACE(string, '><', ' ')) CountWords
FROM CTE
将@t声明为表(id int-identity(1,1),字符串varchar(100))
插入到@t值中
(‘我不是你父亲’),
(“你的哥哥、姐姐、妈妈在哪里?”,
(“你的哥哥、姐姐和妈妈在哪里?”,
(“你是谁?”),
('')
;以CTE为例
(
挑选
身份证件

REPLACE(REPLACE(string,,'>要处理多个空格,请使用此处显示的方法

Declare @s varchar(100)
set @s='Who are     you?'
set @s=ltrim(rtrim(@s))

while charindex('  ',@s)&gt;0
Begin
    set @s=replace(@s,'  ',' ')
end

select len(@s)-len(replace(@s,' ',''))+1 as word_count

如果你问我,这是一个棘手的问题。例如,假设你将数字
3000
作为单词之一出现。那么,在这种情况下,用逗号拆分是不正确的。你应该清楚地告诉我们这里的规则是什么。@TimBiegeleisen逗号或任何其他特殊字符将被视为“单词”的一部分。这在我的问题中已说明。它将满足的唯一有效分隔符是单个空格。是否必须在SQL中完成此操作?:@super user您可以使用SQLCLR编写适当的函数,或者使用Regexp快速计算单词数而不生成临时字符串。每个
REPLACE
都将生成字符串,可能导致执行计划也很糟糕。至于SQL Server 2008-它不再受支持。2012是最早的版本。2016提供了
STRING\u SPLIT
函数这正是我想要的。做得好而且简单。我可以问一下为什么需要+1才能使其正常工作吗?因为[STRING的长度]-[不带分隔符的字符串的长度]返回分隔符的数目。要获得值的数目,您需要添加一个。@ZoharPeled这是一个很好的答案。但是它会将空字符串计为一个单词
id  CountWords
1   5
2   4
3   7
4   3
DECLARE @t AS TABLE(id int identity(1,1), string varchar(100))

INSERT INTO @t VALUES
  ('I am not your father.'),
  ('Where are your brother,sister,mother?'),
  ('Where are your brother, sister and mother?'),
  ('Who are     you?'),
  ('')

;WITH CTE AS
(
  SELECT
    Id,
    REPLACE(REPLACE(string,' ', '><'), '<>', '') string
  FROM @t
)
SELECT 
  id,
  LEN(' '+string)-LEN(REPLACE(string, '><', ' ')) CountWords
FROM CTE
Declare @s varchar(100)
set @s='Who are     you?'
set @s=ltrim(rtrim(@s))

while charindex('  ',@s)&gt;0
Begin
    set @s=replace(@s,'  ',' ')
end

select len(@s)-len(replace(@s,' ',''))+1 as word_count