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)
目前所有行中的wordcount为-1,但我们希望用以下数据填充该列:

  • 文本中的字数,即如果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问题是如何忽略()和[]这就像我自己的查询一样(见上面的注释)-但它不会忽略[]和()单词