Sql 将类型字符串编号拆分为字符列表
我有一个包含字母数字字符串的列,比如123x758v961j 我需要将这个字母数字拆分为字符,并在值之间留有空格 示例:123x758v961j===>123x758v961j 我需要一个返回此解决方案的函数。使用将字符串拆分为单个字符,然后使用经典的XML路径和填充解决方案将字符组合回您可以执行以下操作:Sql 将类型字符串编号拆分为字符列表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含字母数字字符串的列,比如123x758v961j 我需要将这个字母数字拆分为字符,并在值之间留有空格 示例:123x758v961j===>123x758v961j 我需要一个返回此解决方案的函数。使用将字符串拆分为单个字符,然后使用经典的XML路径和填充解决方案将字符组合回您可以执行以下操作: SELECT V.S, STUFF((SELECT ' ' + NG.token FROM dbo.NGrams8k(V.S,1) NG
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);
只是另一种方式
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;
还有一种方法-
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中的每个位置使用一个即时计数和一个运行数字列表来逐个读取字符。此派生表已重新关联
而且-只是为了好玩-为了展示各种方法,还有一种方法使用了一个古怪的更新来避免实际发生的事情;-
WITH Tally(Nmbr) AS
(
SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT @str=STUFF(@str,Nmbr,0,' ')
FROM Tally
ORDER BY Nmbr DESC;
SELECT @str;
这是关闭的重复,但链接的问题是提供了过时的方法使用WHILE循环。。。投票决定重新开始这个问题。。。
WITH Tally(Nmbr) AS
(
SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT @str=STUFF(@str,Nmbr,0,' ')
FROM Tally
ORDER BY Nmbr DESC;
SELECT @str;