代码之家  ›  专栏  ›  技术社区  ›  DDS

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

  •  1
  • DDS  · 技术社区  · 7 年前

    例如:我希望通过查询检索此数据

    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 回复  |  直到 7 年前
        1
  •  8
  •   Thom A    7 年前

    这就利用了 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;
    
        2
  •  1
  •   Gottfried Lesigang    7 年前

    此解决方案需要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] 分析数组时。