Разбить строку типа NUMBER на список символов - PullRequest
0 голосов
/ 25 марта 2019

У меня есть столбец с буквенно-цифровыми строками, такими как 123x758v961j.

Мне нужно разделить это буквенно-цифровое число, чтобы символы имели пустое пространство между значениями.

Пример: 123x758v961j =====> 1 2 3 x 7 5 8 v 9 6 1 j

Мне нужна функция, которая возвращает это решение.

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

Просто по-другому

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

LiveDemo

3 голосов
/ 25 марта 2019

Используя 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);
0 голосов
/ 25 марта 2019

И еще один подход; -)

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...