Как я могу вернуть первое N количество символов, оканчивающихся на полное слово из строки с ограничением da sh? - PullRequest
0 голосов
/ 10 февраля 2020

Мне нужна функция, которая выводит сначала N количество символов во da sh -delimited строке ввода.

Требования :

  1. Если N выпадает в середине слова, включите последнее слово в вывод, даже если общее число превышает N

  2. Если выход заканчивается на «-» И LEN (выход) == N, включите следующее слово

Пример: (N = 70)

declare @Text varchar(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters'

Я уже взял первые 70 символов, что приводит к следующему (я удаляю окончание da sh - в отдельном шаге, не включенном здесь):

SELECT LEFT(@Text + '-', CHARINDEX('-',@Text, 70))
this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-tot

Мне нужна функция, которая возвращает следующее в этом случае:

this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength

Любые решения будут оценены.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

ОБНОВЛЕННЫЙ ОТВЕТ: Исправлено ваше выражение

Это будет работать и основано на том, что опубликовал @Lukstroms; его не соответствует вашему второму требованию (когда @N - это дефис) это с использованием ngrams8k Это будет обрабатывать ситуации, когда @N представляет середину слова или da sh -.

DECLARE 
  @Text VARCHAR(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters',
  @N    INT           = 70;

SELECT SUBSTRING(@Text,0,MAX(ng.nxt))
FROM 
(
  SELECT ng.position, nxt = LEAD(ng.Position,1) OVER (ORDER BY ng.Position), ng.Token
  FROM   samd.ngrams8k(@Text,1) AS ng
  WHERE  ng.Token = '-'  
) AS ng
WHERE ng.Position <= @N;

FINAL UPDATE (ПРИМЕЧАНИЕ О N -GRAMS)

Как правильно заметил Мартин, решение N-Grams слишком сложное, но я был в ru sh и не смог исправить исходное выражение CHARINDEX для OP. Тем не менее, решение ngrams8k очень быстро и гибко.

Например, допустим, требование включало параметр верхней и нижней границы; Например, нам нужно все между первый дефис выше @Low и последний дефис ниже @High. Это можно сделать с помощью небольшого изменения в ответе выше.

DECLARE
  @Text VARCHAR(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters',
  @Low  INT           = 16,
  @high INT           = 70;

SELECT NewString = SUBSTRING(@Text,MIN(ng.position)+1, MAX(ng.nxt)-MIN(ng.position)-1)
FROM 
(
  SELECT ng.position, nxt=LEAD(ng.Position,1) OVER (ORDER BY ng.Position)
  FROM   samd.ngrams8k(@Text,1) AS ng
  WHERE  ng.Token = '-'  
) AS ng
WHERE ng.Position <= @high AND ng.Position > @low;

Возвращает:

prepared-for-better-Google-Search-Engnine-SEO-totalLength
0 голосов
/ 04 марта 2020

Спасибо @LukStorms

Я добился этого с помощью следующего утверждения:

LEFT(@Text,CHARINDEX('-',@Text+'-',70)-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...