Первые два слова в строке - sql server - PullRequest
3 голосов
/ 07 декабря 2010

У меня есть строка, подобная этой: «Это привет мир».

Теперь я хочу получить первые два слова предложения в качестве выходных данных в SQL Server.т.е. это.

Другой пример: Исходное предложение: «Завершить упражнение слова». Вывод: Завершить слово

Ответы [ 3 ]

13 голосов
/ 07 декабря 2010

Вы можете использовать запрос следующим образом:

DECLARE @d nvarchar(100)
SET @d = 'Complete word exercise'
SELECT SUBSTRING(@d, 0, CHARINDEX(' ', @d, CHARINDEX(' ', @d, 0)+1))

Или, при использовании в запросе:

SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1)) 
FROM Table
4 голосов
/ 22 декабря 2017

Многие решения сломаются для любых строк, у которых меньше 2 слов , что очень вероятно для людей, надеющихся проанализировать первое n количество слов.

Давайте сначала посмотрим на запрос, а затем, как определить, правильно ли он оценивался.
Для этого нам нужно вложить несколько CHARINDEX операторов, которые принимают следующие параметры:

CHARINDEX( <i>expressionToFind</i> , <i>expressionToSearch</i> [ , <i>start_location</i> ] )

Charindex вернет индекс first , где он найдет конкретную строку. Что мы продолжаем делать, так это пинаем мяч по дороге, добавляя start_location, равный первому найденному экземпляру +1, чтобы он нашел 2-й, 3-й, 4-й экземпляр и т. Д. Кроме того, вместо SUBSTRING(@str, 0,... мы можем просто использовать LEFT(@str,..., чтобы захватить первую часть строки, но в любом случае вычислить, насколько далеко идти, трудная часть:

DECLARE @string VARCHAR(1000) = 'One Two Three';
SELECT LEFT(@string, CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string)+1)+1)+1))

Но это потерпит неудачу , если у нас не будет минимального количества слов:
Технически, он просто будет бесконечно зацикливаться. Как только у него заканчиваются пробелы, он начинает индексирование снова с начала

Char Index Demo

Pop quiz ... что решит вышеуказанный запрос? Наведите курсор для ответа

В решении в Извлекая определенное количество слов из строки в sql , мы можем проверить, что последний CHARINDEX выдал ненулевое значение, что означает, что он достиг пробела на этом уровне глубина. Но также, поскольку вложенный charindex является довольно громоздким, мы можем получить эту информацию чуть более напрямую, подсчитав количество вхождений определенной подстроки в SQL varchar?

Итак, окончательное решение должно выглядеть следующим образом: 4 слова :

DECLARE @string VARCHAR(1000) = 'One Two Three Four Five Six';

SELECT CASE WHEN LEN(@string)-LEN(REPLACE(@string, ' ', '')) < 4 
            THEN @string
            ELSE LEFT(@string, CHARINDEX(' ', @string,
                               CHARINDEX(' ', @string,
                               CHARINDEX(' ', @string,
                               CHARINDEX(' ', @string)+1)+1)+1))
       END

Если пробелов меньше 4, мы просто вернем всю строку. Для более чем четырех мы найдем позицию 4-го пробела и вернем левую часть строки до этой позиции

1 голос
/ 07 декабря 2010

ТОЛЬКО ОРАКУЛ - Вы также можете использовать INSTR вот так:

SELECT SUBSTR(colName, 0, INSTR(colName,' ',1,2)) FROM table

Примечание. Если данные строки содержат менее 2 слов, будет возвращена пустая строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...