如何在TSQL中获得单词的缩写?

时间:2018-01-10 16:37:39

标签: sql-server tsql

例如,如果我有一个输入字符串" OrderTrackingNumber",我希望它返回" OTN"。或者,如果我有输入字符串" MyOrder",我希望它返回MO。

2 个答案:

答案 0 :(得分:1)

提供您的列名始终是首字母大写的首字母,您可以使用以下内容:

create function fn_extractupper(@var varchar(50))
returns varchar(50)
as
begin

declare @aux varchar(50) = ''
declare @size int = len(@var)
declare @position int = 0
while @position < @size
    begin
        if ASCII(SUBSTRING(@var,@position,1)) = ASCII(UPPER(SUBSTRING(@var,@position,1)))
            begin
                set @aux = @aux + SUBSTRING(@var,@position,1)
            end
        set @position = @position + 1
    end

return @aux
END

答案 1 :(得分:0)

从SQL Server 2017开始,您应该阅读new function TRANSLATE。加上区分大小写的排序规则,这应该对您的问题有利。

但大多数人都没有这个版本(我也是)。所以你可以试试这个:

DECLARE @mockupTable TABLE(ID INT IDENTITY, InputString VARCHAR(100));
INSERT INTO @mockupTable VALUES('OrderTrackingNumber')
                              ,('MyOrder')
                              ,('OneMoreExample');

WITH recCTE AS
(
    SELECT ID
          ,InputString
          ,2 AS NextPos
          ,SUBSTRING(InputString,1,1) AS Letter
    FROM @mockupTable AS mt

    UNION ALL
    SELECT r.ID
          ,r.InputString
          ,r.NextPos+1
          ,SUBSTRING(r.InputString,r.NextPos,1)
    FROM recCTE AS r
    WHERE r.NextPos<LEN(r.InputString)+1
)   
SELECT r1.ID
      ,(
        SELECT r2.Letter AS [*]
        FROM recCTE AS r2
        WHERE ASCII(r2.Letter) BETWEEN ASCII('A') AND ASCII('Z')
          AND r1.ID=r2.ID
        FOR XML PATH('')
       )
FROM recCTE AS r1
GROUP BY r1.ID

递归CTE将沿着字母行走并逐一返回 最终查询使用外部分组查询和子选择,以XML格式返回 这将是重新连接的字符串 如果没有内部WHERE检查ASCII()值,结果将与初始值完全相同。