将类型字符串NUMBER拆分为字符列表

时间:2019-03-25 12:03:23

标签: sql sql-server tsql

我有一列包含字母数字字符串,例如123x758v961j

我需要将此字母数字数字拆分为字符,并在值之间留有空格。

示例:123x758v961j =====> 1 2 3 x 7 5 8 v 9 6 1 j

我需要一个返回此解决方案的函数。

3 个答案:

答案 0 :(得分:3)

使用NGrams8K将字符串拆分为单个字符,然后使用“经典” FOR XML PATHSTUFF解决方案将字符组合回去,您可以执行以下操作:

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

Live Demo

答案 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