如何在固定数量的字符后如何“截断” 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.
答案 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]
中的顺序位置。