2013-12-06 3 views
0

У нас есть таблица текстов с колоннами:Как написать этот сложный запрос UPDATE?

  • WordCount (интермедиат)
  • текст (VARCHAR 1024)

В настоящее время WordCount -1 во всех строках, но мы хотели бы заполнить столбец с этими данными:

  • количество слов в тексте, то есть, если текст = "Hello Stackoverflow" => WordCount = 2
  • Если слово в тексте находится в() или [], оно не должно учитываться, то есть «Привет всем в Stackoverflow» => wordcount = 5, но «Hello (to) each on Stackoverflow» => wordcount = 4, так как (to) находится в a()

Кто-нибудь знает, как написать такой запрос UPDATE?

+2

Пробовали ли вы что-нибудь? –

+0

Запросы UPDATE просты: что займет немного больше работы, это написать функцию, которая учитывает слова. Попробуйте googling для «SQL split words». – Joe

+0

Выписали это уже: UPDATE тексты SET WordCount = LEN (текст) - LEN (REPLACE (текст, '', '')) + 1 Проблема заключается в том, как игнорировать() и [] – user2500179

ответ

2

Если вы уверены, что слова a разделены пробелами (не запятыми и т. Д.). Вы можете сделать что-то вроде этого:

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 доступны в настоящее время, так что я не могу проверить это сейчас.

+0

этом так же, как мой собственный запрос (см. выше в комментариях) - но он не игнорирует слова [] и() – user2500179

0

Попробуйте этот запрос:

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

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

Это полностью работает на тестовых данных.

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 
     ) 
    ) 
Смежные вопросы