Sql 将列中的值分隔为SSM中的不同段或列
我有一个表Sql 将列中的值分隔为SSM中的不同段或列,sql,sql-server,Sql,Sql Server,我有一个表表1,如下所示: YEAR | GL_CODE ------------------------------------------- 2019 | 141.0000.1001.732155.0000.000.0000. 2019 | 141.0000.0000.143402.0000.131.0000. 2019 | 541.000.00.00.00.149104.0000.000.00 2019 | 541.101.04.00.00.7311
表1
,如下所示:
YEAR | GL_CODE
-------------------------------------------
2019 | 141.0000.1001.732155.0000.000.0000.
2019 | 141.0000.0000.143402.0000.131.0000.
2019 | 541.000.00.00.00.149104.0000.000.00
2019 | 541.101.04.00.00.731104.0000.000.00
2019 | 141.0000.0000.151310.0000.000.0000.
2019 | 541.102.06.00.16.714101.7098.000.00
2019 | 111.00000.0511.766701.0000.000.0000
2019 | 111.00000.0512.520111.5003.331.0000
我需要将其分离为不同的段或列,如下所示:
YEAR |SEGMENT1|SEGMENT2|SEGMENT3|SEGMENT4|SEGMENT5|SEGMENT6|SEGMENT7 |SEGMENT8|SEGMENT9
------------------------------------------------------------------------------------------
2019 | 141 | 0000 | 1001 |732155 | 0000 | 000 | 0000 | NULL | NULL
2019 | 141 | 0000 | 0000 |143402 | 0000 | 131 | 0000 | NULL | NULL
2019 | 541 | 000 | 00 | 00 | 00 |149104 | 0000 | 000 | 00
2019 | 541 | 101 | 04 | 00 | 00 |731104 | 0000 | 000 | 00
2019 | 141 | 0000 | 0000 |151310 | 0000 | 000 | 0000 | NULL | NULL
2019 | 541 | 102 | 06 | 00 |714101 |714101 | 7098 | 000 | 00
2019 | 111 | 00000 | 0511 |766701 | 0000 | 000 | 0000 | NULL | NULL
2019 | 111 | 00000 | 0512 |520111 | 5003 | 331 | 0000 | NULL | NULL
请注意,中的所有条目都没有固定数量的段
我尝试使用:
select YEAR,PERIOD,SUBSTRING(GL_CODE,1,3) as segment1,
SUBSTRING(GL_CODE,
charindex('.', GL_CODE, 1)+1,
((charindex('.',GL_CODE, (charindex('.', GL_CODE, 1)+1))+1)-(charindex('.', GL_CODE, 1)+1)-1)
) as segment2,
SUBSTRING(GL_CODE,
charindex('.',GL_CODE, (charindex('.', GL_CODE, 1)+1))+1,
(charindex('.',GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1)-
(charindex('.',GL_CODE, ( charindex('.', GL_CODE, 1)+1))+1)-1
) as segment3,
SUBSTRING(GL_CODE,
charindex('.',GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1,
(charindex('.',GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1 )-(charindex('.',GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1)-1
) as segment4,
SUBSTRING(GL_CODE,
charindex('.',GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1,(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.',GL_CODE, 1)+1))+1))+1))+1))+1)-(charindex('.',GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1)-1
) as segment5,
SUBSTRING(GL_CODE,
charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE,
(charindex('.',GL_CODE, 1)+1))+1))+1))+1))+1,
(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,
(charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1)
-(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.',GL_CODE, 1)+1))+1))+1))+1))+1)-1
) as segment6,
SUBSTRING(GL_CODE,
charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,
(charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1,
(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,
(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1))+1)
-(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1)-1
) as segment7,
SUBSTRING(GL_CODE,
charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,
(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1))+1,
(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,
(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE,
(charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1))+1))+1)
-(charindex('.',GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,(charindex('.', GL_CODE,
(charindex('.', GL_CODE, (charindex('.', GL_CODE, (charindex('.', GL_CODE, 1)+1))+1))+1))+1))+1))+1))+1)-1
) as segment8
from TABLE1;
我得到的价值高达第六段。。。在第六节之后,我发现了一些错误。
有人能建议修改代码或替代方法吗
提前谢谢
Akshay创建自定义函数(用户定义函数)
然后在查询中使用该函数
CREATE TABLE #TBL ([YEAR] INT, GL_CODE VARCHAR(300))
INSERT INTO #TBL VALUES
(2019,'141.0000.1001.732155.0000.000.0000.'),
(2019,'141.0000.0000.143402.0000.131.0000.'),
(2019,'541.000.00.00.00.149104.0000.000.00'),
(2019,'541.101.04.00.00.731104.0000.000.00'),
(2019,'141.0000.0000.151310.0000.000.0000.'),
(2019,'541.102.06.00.16.714101.7098.000.00'),
(2019,'111.00000.0511.766701.0000.000.0000'),
(2019,'111.00000.0512.520111.5003.331.0000');
SELECT
[YEAR],
f.*
FROM #TBL
cross apply dbo.fn_Split(#TBL.GL_CODE, '.', DEFAULT) as f
输出
您可以将列名更改为您的列名原始答案: 您的错误可能是
传递给LEFT或SUBSTRING函数的长度参数无效。
。如果只需要使用基本函数,那么一种可能的方法是修复GL_code
列中的值,并添加必要的
字符
SELECT
-- your complex statement here
FROM (
SELECT YEAR, CONCAT(GL_CODE, REPLICATE('.', 9 - LEN(GL_CODE) + LEN(REPLACE(GL_CODE, '.', '')))) AS GL_CODE
FROM Table1
) t
更新:
如果您可以使用SQL Server 2016+,您可以尝试一种基于JSON的方法。其思想是将文本转换为有效的JSON数组(141.0000.1001.732155.0000.000.0000.
转换为[[“141”、“0000”、“1001”、“732155”、“0000”、“000”、“0000”]]
),然后使用带有显式模式的OPENJSON()
解析此JSON文本。请注意,STRING\u SPLIT()
不应该是选项,因为拆分的子字符串的顺序不能保证与输入字符串中的子字符串的顺序匹配
表:
CREATE TABLE Data (
[YEAR] int,
GL_CODE varchar(100)
)
INSERT INTO Data
([YEAR], GL_CODE)
VALUES
(2019, '141.0000.1001.732155.0000.000.0000.'),
(2019, '141.0000.0000.143402.0000.131.0000.'),
(2019, '541.000.00.00.00.149104.0000.000.00'),
(2019, '541.101.04.00.00.731104.0000.000.00'),
(2019, '141.0000.0000.151310.0000.000.0000.'),
(2019, '541.102.06.00.16.714101.7098.000.00'),
(2019, '111.00000.0511.766701.0000.000.0000'),
(2019, '111.00000.0512.520111.5003.331.0000');
声明:
SELECT
d.[YEAR],
j.*
FROM Data d
CROSS APPLY OPENJSON(CONCAT(
'[["',
REPLACE(
CASE
WHEN RIGHT(d.GL_CODE, 1) = '.' THEN LEFT(d.GL_CODE, LEN(d.GL_CODE) - 1)
ELSE GL_CODE
END, '.', '","'),
'"]]'
)
) WITH (
SEGMENT1 varchar(10) '$[0]',
SEGMENT2 varchar(10) '$[1]',
SEGMENT3 varchar(10) '$[2]',
SEGMENT4 varchar(10) '$[3]',
SEGMENT5 varchar(10) '$[4]',
SEGMENT6 varchar(10) '$[5]',
SEGMENT7 varchar(10) '$[6]',
SEGMENT8 varchar(10) '$[7]',
SEGMENT9 varchar(10) '$[8]'
) j
结果:
YEAR SEGMENT1 SEGMENT2 SEGMENT3 SEGMENT4 SEGMENT5 SEGMENT6 SEGMENT7 SEGMENT8 SEGMENT9
2019 141 0000 1001 732155 0000 000 0000
2019 141 0000 0000 143402 0000 131 0000
2019 541 000 00 00 00 149104 0000 000 00
2019 541 101 04 00 00 731104 0000 000 00
2019 141 0000 0000 151310 0000 000 0000
2019 541 102 06 00 16 714101 7098 000 00
2019 111 00000 0511 766701 0000 000 0000
2019 111 00000 0512 520111 5003 331 0000
您的SQl Server版本是什么?您是否看过我在上一个@Zhorov:SQl Server management Studio中标记的副本2018@Larnu:是的,我经历过。。。但我需要用子串和CHARINDEX或类似的基本函数来完成这个。。。因为它需要在不同的工具中运行。。。它只接受基本功能,标记该工具,并在问题中告诉我们。如果您仅限于函数,那么听起来您好像也没有使用SQL Server。
YEAR SEGMENT1 SEGMENT2 SEGMENT3 SEGMENT4 SEGMENT5 SEGMENT6 SEGMENT7 SEGMENT8 SEGMENT9
2019 141 0000 1001 732155 0000 000 0000
2019 141 0000 0000 143402 0000 131 0000
2019 541 000 00 00 00 149104 0000 000 00
2019 541 101 04 00 00 731104 0000 000 00
2019 141 0000 0000 151310 0000 000 0000
2019 541 102 06 00 16 714101 7098 000 00
2019 111 00000 0511 766701 0000 000 0000
2019 111 00000 0512 520111 5003 331 0000