У меня есть данные столбца, как показано ниже,

126-35-56-24

И я хочу, чтобы результаты были такими,

select 126 as Id, 35 as Age, 56 as EmpId, 24 as Day

Я просто пытаюсь использовать substring и могу разделить строку на 126 и 35-56-24, но не могу получить желаемый результат.

Пожалуйста, помогите мне получить это. Заранее спасибо...

0
DineshDB 8 Сен 2016 в 15:30

5 ответов

Лучший ответ

Используйте приведенный ниже скрипт, который разделит строки на основе индекса символа '-'.

DECLARE @data varchar(50)='126-35-56-24'

SELECT 'SELECT '+ SUBSTRING(@data,1,CHARINDEX('-', @data)-1) + ' as Id, '
   +SUBSTRING(@data,CHARINDEX('-', @data)+1,CHARINDEX('-', @data,CHARINDEX('-',@data) + 1) -CHARINDEX('-', @data)-1)+ ' as Age, '
   +SUBSTRING(@data,CHARINDEX('-', @data,CHARINDEX('-',@data)+1)+1,CHARINDEX('-', @data,CHARINDEX('-', @data,CHARINDEX('-',@data)+1)+1) -CHARINDEX('-', @data,CHARINDEX('-',@data)+1)-1)+' as EmpId, '
   +SUBSTRING(@data,CHARINDEX('-', @data,CHARINDEX('-', @data,CHARINDEX('-',@data)+1)+1)+1,LEN(@data)-CHARINDEX('-', @data,CHARINDEX('-', @data,CHARINDEX('-',@data)+1)+1)+1) +' as Day'

Пример вывода:

enter image description here

1
Unnikrishnan R 8 Сен 2016 в 14:02

Используйте приведенный ниже сценарий:

DECLARE @VAR VARCHAR(50)='126-35-56-24'
SELECT [1] AS ID, [2] AS AGE,[3] AS EMPID,[4] as day
FROM  (SELECT [1],[2],[3],[4]
   FROM    
      (SELECT ID,VAL FROM Spliter(@VAR,'-')) AS B
   PIVOT (MAX(VAL) FOR ID IN ([1],[2],[3],[4])
         ) AS A
  ) AS C

И для разделения:

CREATE FUNCTION Spliter
(
@delimited nvarchar(max),
@delimiter nvarchar(100)
) RETURNS @t TABLE
(
 id int identity(1,1),
 val nvarchar(max)
)
 AS
 BEGIN
 declare @xml xml
 set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r>       </root>'

 insert into @t(val)
 select
 r.value('.','varchar(max)') as item
 from @xml.nodes('//root/r') as records(r)

 RETURN
 END
 GO
3
K.K 8 Сен 2016 в 13:09

Вы можете использовать parsename, если это всегда 4 набора данных.

Я просто заменил - на. и пусть parsename сделает все остальное.

SELECT PARSENAME(Replace(Col,'-','.'), 1) AS 'Object Name' ID,    
       PARSENAME(Replace(Col,'-','.'), 2) AS 'Age',  
       PARSENAME(Replace(Col,'-','.'), 3) AS 'EmpID',  
       PARSENAME(Replace(Col,'-','.'), 4) AS 'Day'
FROM YOURTABLE
6
xQbert 8 Сен 2016 в 13:07

Если вы используете SQL Server 2016, вы можете использовать функцию string_split

declare @str varchar(20) = '126-35-56-24'

select  id = max(case when rn=1 then value else null end)
    ,age =  max(case when rn=2 then value else null end)
    ,empId =  max(case when rn=3 then value else null end)
    ,[Day] =  max(case when rn=4 then value else null end)
    from (select row_number() over(order by (select 1)) as rn, value from string_split(@str, '-')) a
1
Kannan Kandasamy 8 Сен 2016 в 12:57

Поскольку никто об этом не упомянул, вы можете просто использовать функцию PARSENAME. Он уже довольно давно доступен в SQL Server. У него есть некоторые ограничения, но он справится с задачей в приведенном вами примере.

2
Tab Alleman 8 Сен 2016 в 13:03