使用(T-)SQL截断字符串中的每个单词

时间:2018-08-30 14:07:21

标签: sql sql-server string tsql

如何在固定数量的字符后如何“截断” 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 :(得分:8)

这利用了DelimitedSplit8k,因此依赖于您的值不超过8000。为什么不STRING_SPLIT呢? still 仍然缺少该顺序位置列,这对于使结果保持相同顺序至关重要。无论如何,我想这就是你所追求的:

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;

答案 1 :(得分:1)

此解决方案需要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]中的顺序位置。