例如,如果我有一个输入字符串" OrderTrackingNumber",我希望它返回" OTN"。或者,如果我有输入字符串" MyOrder",我希望它返回MO。
答案 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()
值,结果将与初始值完全相同。