Многие решения сломаются для любых строк, у которых меньше 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))
Но это потерпит неудачу , если у нас не будет минимального количества слов:
Технически, он просто будет бесконечно зацикливаться. Как только у него заканчиваются пробелы, он начинает индексирование снова с начала
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-го пробела и вернем левую часть строки до этой позиции