如何编写这个复杂的UPDATE查询?

时间:2013-12-06 07:24:06

标签: sql sql-server

我们有表格Texts的列:

  • wordcount(int)
  • text(varchar 1024)

目前wordcount在所有行中都是-1,但我们想用这些数据填充列:

  • 文本中的单词数,即text =" Hello Stackoverflow" => wordcount = 2
  • 如果文本中的单词在()或[]中,则不应该计数,即"对Stackoverflow上的每个人都有问候" => wordcount = 5,但" Hello(to)Stackoverflow上的所有人" => wordcount = 4,因为(to)在a()

任何人都知道如何编写这样的UPDATE查询?

3 个答案:

答案 0 :(得分:2)

如果你确定单词只用空格分隔(不是用逗号等)。你可以这样做:

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可用,所以我现在无法测试。

答案 1 :(得分:0)

尝试此查询:

UPDATE Texts SET wordcount = 
len( replace( replace( replace( replace(text ,' [' ,'' ) ,']' , '') ,' (' ,'' ),')' ,'' )) - 

len(replace( replace( replace( replace( replace(text ,' [' ,'' ) ,']' , '') ,' (' ,'' ),')' ,'' ),' ','')) +1

它完全适用于您的测试用例。

答案 2 :(得分:0)

如果你有SELECT语句计算单词的数量,你可以这样做来计算非单词的数量' (括号括起)。

SELECT (LEN(text) - LEN(REPLACE(text, ' ', ''))) + 1 - (
        LEN(text) - LEN(REPLACE(text, '(', ''))
        )
FROM TEXTS

查看this SQLFiddle以了解查询的工作原理。

更新很容易实现:

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

您可以找到SQLFiddle here

在这种情况下,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
       )
    )