Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将列中的值分隔为SSM中的不同段或列_Sql_Sql Server - Fatal编程技术网

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