Sql 如何编写这个复杂的更新查询?
我们有带列的表格文本:Sql 如何编写这个复杂的更新查询?,sql,sql-server,Sql,Sql Server,我们有带列的表格文本: 字数(整数) 文本(varchar 1024) 目前所有行中的wordcount为-1,但我们希望用以下数据填充该列: 文本中的字数,即如果text=“Hello Stackoverflow”=>wordcount=2 如果文本中的某个单词位于a()或a[]中,则不应计算在内,即“向Stackoverflow上的所有人问好”=>wordcount=5,但“向Stackoverflow上的所有人问好”=>wordcount=4,因为(to)位于() 有人知道如何编写
- 字数(整数)
- 文本(varchar 1024)
- 文本中的字数,即如果text=“Hello Stackoverflow”=>wordcount=2
- 如果文本中的某个单词位于a()或a[]中,则不应计算在内,即“向Stackoverflow上的所有人问好”=>wordcount=5,但“向Stackoverflow上的所有人问好”=>wordcount=4,因为(to)位于()
有人知道如何编写这样的更新查询吗?如果您确定单词a仅由空格(而不是逗号等)分隔。你可以这样做:
UPDATE TEXTS
SET WORDCOUNT = (
LEN(text) - LEN(REPLACE(text, ' ', '')))
+ 1
- (
CASE
WHEN LEN(text) - LEN(REPLACE(text, ')', '')) > LEN(text) - LEN(REPLACE(text, '(', ''))
THEN LEN(text) - LEN(REPLACE(text, '(', ''))
ELSE
LEN(text) - LEN(REPLACE(text, ')', ''))
END
)
)
X=使用LEN()
的字符串长度
Y=使用REPLACE()
从行中删除空格后字符串的长度
然后X-Y是字符串中的空格数,(X-Y)+1(第一个单词)是单词数
SELECT (LEN(text) - LEN(REPLACE(text, ' ', ''))) + 1 FROM Texts
并转换为更新:
UPDATE TABLE TEXTS SET wordcount = (LEN(text) - LEN(REPLACE(text, ' ', ''))) + 1
当前没有可用的MS SQL Server,因此我现在无法进行测试。请尝试此查询:
UPDATE Texts SET wordcount =
len( replace( replace( replace( replace(text ,' [' ,'' ) ,']' , '') ,' (' ,'' ),')' ,'' )) -
len(replace( replace( replace( replace( replace(text ,' [' ,'' ) ,']' , '') ,' (' ,'' ),')' ,'' ),' ','')) +1
它完全适用于您的测试用例。如果您有统计字数的
SELECT
语句,您可以同样计算“非字数”(用括号括起来)
查看查询是如何工作的
通过以下内容可以很容易地进行更新:
UPDATE TEXTS
SET WORDCOUNT = (LEN(text) - LEN(REPLACE(text, ' ', ''))) + 1 - (
LEN(text) - LEN(REPLACE(text, '(', ''))
)
只有当文本格式正确,所有打开的圆括号都关闭(文本中的(
与文本中的)
编号相同)时,此更新才会起作用
但是,如果单词周围的开/闭括号可能比应该的多,比如在拼写错误的情况下,您应该使用以下方法:
SELECT (
LEN(text) - LEN(REPLACE(text, ' ', '')))
+ 1
- (
CASE
WHEN LEN(text) - LEN(REPLACE(text, ')', '')) > LEN(text) - LEN(REPLACE(text, '(', ''))
THEN LEN(text) - LEN(REPLACE(text, '(', ''))
ELSE
LEN(text) - LEN(REPLACE(text, ')', ''))
END
)
FROM TEXTS
你可以找到那个
在本例中,UPDATE语句如下所示:
UPDATE TEXTS
SET WORDCOUNT = (
LEN(text) - LEN(REPLACE(text, ' ', '')))
+ 1
- (
CASE
WHEN LEN(text) - LEN(REPLACE(text, ')', '')) > LEN(text) - LEN(REPLACE(text, '(', ''))
THEN LEN(text) - LEN(REPLACE(text, '(', ''))
ELSE
LEN(text) - LEN(REPLACE(text, ')', ''))
END
)
)
你试过什么了吗?更新查询很简单:需要更多工作的是编写计算单词的函数。试着用谷歌搜索“SQL拆分单词”。已经写了:UPDATE text SET wordcount=LEN(text)-LEN(REPLACE(text),,'')+1问题是如何忽略()和[]这就像我自己的查询一样(见上面的注释)-但它不会忽略[]和()单词