как разделить / рассмотреть 3 символа в каждой строке - PullRequest
0 голосов
/ 13 апреля 2019

Привет У меня есть одно сомнение в SQL Server

как разделить длину 3 до последних символов в SQL Server

table : emp 
id  | name  
1   | harikrishnaxx
2   | Baludevu

на основе данных выше, я хочу вывод, как показано ниже:

id  | name 
1   | har
1   |ikr
1   |ish
1   |nax
1   |x
2   | bal
2   |ude
2   |vu

я попробовал, как показано ниже: 1-й, я создаю табличную функцию, затем вызывал эту функцию в таблице emp

create  FUNCTION DatesBetween(@name varchar(50))
RETURNS @dates TABLE (
   DateValue varchar(50)  NULL
) 
AS
BEGIN
declare @fin varchar(50)
declare @len int = (select len(@name))
declare @i int 
set @i=1
while (@i <=@len)
begin
insert into @dates (DateValue)values(@fin)
set  @fin =SUBSTRING (@name ,@i,3)
set @i=@i+3
   END;
 RETURN;
END;

select  id ,   dbo.DatesBetween(name ) from emp 

, но запрос не получил точного результата.Подскажите, пожалуйста, как решить эту проблему на сервере sql

1 Ответ

1 голос
/ 13 апреля 2019

Создайте эту встроенную пользовательскую функцию с табличным значением, которая может адаптироваться к любому размеру, который вы хотите, чтобы ваши чанки были:

CREATE OR ALTER FUNCTION dbo.ChunkNames(@name varchar(50), @len int)
RETURNS TABLE
AS
  RETURN 
  (
    WITH n(n) AS 
    (
      SELECT n=1 UNION ALL 
      SELECT n+1 FROM n 
        WHERE n < LEN(@name)/@len
              + CASE LEN(@name)%@len WHEN 0 THEN 0 
                ELSE 1 END
    )
    SELECT n, chunk = SUBSTRING(@name,(n-1)*@len+1,@len) FROM n
  );
GO

Теперь со следующими примерами данных:

CREATE TABLE #emp
(id int, name sysname);

INSERT #emp(id,name) VALUES(1,'harikrishnaxx'),
  (2,'Baludevu'),(3,'woo'),(4,'booboo');

Тогда с этим запросом:

SELECT e.id, name = f.chunk 
  FROM #emp AS e
  CROSS APPLY dbo.ChunkNames(e.name,3) AS f
  ORDER BY e.id, f.n;

Вы получите следующие результаты:

id  name
--  ----
1   har
1   ikr
1   ish
1   nax
1   x
2   Bal
2   ude
2   vu
3   woo
4   boo
4   boo

Если вам нужно использовать это для других строк, чтобы разделить, которые могут быть длиннее 100 символов, вам нужно будет добавить OPTION (MAXRECURSION 0) к запросу.

...