У меня есть данные столбца, как показано ниже,
126-35-56-24
И я хочу, чтобы результаты были такими,
select 126 as Id, 35 as Age, 56 as EmpId, 24 as Day
Я просто пытаюсь использовать substring
и могу разделить строку на 126 и 35-56-24, но не могу получить желаемый результат.
Пожалуйста, помогите мне получить это. Заранее спасибо...
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'
Пример вывода:
Используйте приведенный ниже сценарий:
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
Вы можете использовать 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
Если вы используете 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
Поскольку никто об этом не упомянул, вы можете просто использовать функцию PARSENAME
. Он уже довольно давно доступен в SQL Server. У него есть некоторые ограничения, но он справится с задачей в приведенном вами примере.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.