【问题标题】:Split a type string NUMBER to list of chars将类型字符串 NUMBER 拆分为字符列表
【发布时间】:2019-03-25 12:03:22
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这已作为重复关闭,但链接的问题只是提供了使用 WHILE 循环的过时方法...投票重新打开问题...

标签: sql sql-server tsql


【解决方案1】:

使用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);

【讨论】:

    【解决方案2】:

    另一种方式

    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

    【讨论】:

      【解决方案3】:

      还有一种方法 ;-)

      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('')
                  )
                 );
      

      这个想法是,使用 tally-on-the-fly@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;
      

      【讨论】:

        猜你喜欢
        • 2019-04-16
        • 1970-01-01
        • 2015-09-01
        • 2011-11-13
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        相关资源
        最近更新 更多