我有一列包含字母数字字符串,例如123x758v961j
。
我需要将此字母数字数字拆分为字符,并在值之间留有空格。
示例:123x758v961j
=====> 1 2 3 x 7 5 8 v 9 6 1 j
我需要一个返回此解决方案的函数。
答案 0 :(得分:3)
使用NGrams8K
将字符串拆分为单个字符,然后使用“经典” FOR XML PATH
和STUFF
解决方案将字符组合回去,您可以执行以下操作:
SELECT V.S,
STUFF((SELECT ' ' + NG.token
FROM dbo.NGrams8k(V.S,1) NG
ORDER BY NG.position
FOR XML PATH(''),TYPE).value('.','varchar(100)'),1,1,'') AS S2 --Use a varchar length that is double(-1) then length of your actual data type here
FROM (VALUES('123x758v961j'))V(S);
答案 1 :(得分:3)
另一种方式
CREATE FUNCTION dbo.SplitToChars(
@String NVARCHAR(300)
)
RETURNS NVARCHAR(300)
AS
BEGIN
DECLARE @Result NVARCHAR(300) = '';
WITH CTE AS
(
SELECT 1 N
UNION ALL
SELECT N + 1
FROM CTE
WHERE N < LEN(@String)
)
SELECT @Result = CONCAT(@Result, SUBSTRING(@String, N, 1), N' ')
FROM CTE;
RETURN (RTRIM(@Result));
END;
然后只SELECT dbo.SplitToChars(N'123x758v961j')
返回:
1 2 3 x 7 5 8 v 9 6 1 j
答案 2 :(得分:0)
还有另一种方法;-)
df.groupby([df['entrance'].dt.to_period("M")]).entrance.count().cumsum()
这个想法是,使用即时提示(DECLARE @str VARCHAR(100)='123x758v961j';
WITH Tally(Nmbr) AS
(
SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT TRIM(
(
SELECT ' ' + SUBSTRING(@str,Nmbr,1)
FROM Tally
ORDER BY Nmbr
FOR XML PATH('')
)
);
中每个位置的运行编号列表)逐个读取字符 -一个。此派生表将重新连接。
而且-只是为了好玩-演示方法的范围,另外一种方法是使用古怪的更新(实际上可以避免的事情;-))
@str