Усечь каждое слово в строке с (T-) SQL - PullRequest
0 голосов
/ 30 августа 2018

Как я могу «усечь» каждое слово в фразе в SQL после фиксированного числа символов?

Например: я хочу, чтобы эти данные были получены по запросу

select descrizione 
from mytable

так что все в одном столбце.

FISIOPATOLOGIA DELLA RIPRODUZIONE UMANA
ODONTOIATRIA E STOMATOLOGIA
CHIRURGIA MAXILLO FACCIALE

Преобразуется следующим образом (усечено, если длиннее 6 символов), все еще в одном столбце:

FISIOL. DELLA RIPROD. UMANA
ODONTO. E STOMAT.
CHIRUR. MAXILL. FACCIA.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Для этого решения требуется SQL-Server 2016 (для OPENJSON), но не требуется никакой функции:

DECLARE @tbl TABLE(ID INT IDENTITY, YourText VARCHAR(100));
INSERT INTO @tbl VALUES
 ('FISIOPATOLOGIA DELLA RIPRODUZIONE UMANA')
,('ODONTOIATRIA E STOMATOLOGIA')
,('CHIRURGIA MAXILLO FACCIALE');

DECLARE @maxLength INT = 6;

SELECT t1.ID
      ,t1.YourText
      ,STUFF((
        SELECT ' ' + CASE WHEN LEN(A.[value])<=6 THEN A.[value] ELSE LEFT(A.[value],@maxLength) + '.' END
        FROM OPENJSON('["' + REPLACE(t1.YourText,' ','","') + '"]') A
        ORDER BY A.[key]
        FOR XML PATH(''),TYPE
       ).value('text()[1]','nvarchar(max)'),1,1,'')
FROM @tbl t1

OPENJSON возвращает порядковый номер в столбце [key] при анализе массива.

0 голосов
/ 30 августа 2018

Используется DelimitedSplit8k, и, следовательно, полагается, что у вас нет значения, превышающего 8000. Почему бы не STRING_SPLIT? до сих пор отсутствует этот порядковый столбец позиции, жизненно важно для сохранения результатов в том же порядке. Во всяком случае, я думаю, что вы получите то, что вы после:

WITH VTE AS(
    SELECT *
    FROM (VALUES ('FISIOPATOLOGIA DELLA RIPRODUZIONE UMANA'),
                 ('ODONTOIATRIA E STOMATOLOGIA'),
                 ('CHIRURGIA MAXILLO FACCIALE')) V(String))
SELECT STUFF((SELECT ' ' + LEFT(DS.Item,6) + CASE WHEN LEN(DS.Item) > 6 THEN '.' ELSE '' END
              FROM dbo.DelimitedSplit8K(V.String,' ') DS
              ORDER BY DS.ItemNumber
              FOR XML PATH('')),1,1,'') AS ShortString
FROM VTE V;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...