数据记录分多行处理(sqlserver)

    技术2024-08-14  69

     一、需求说明

    将一条记录处理成多行。

    1、需要提取charge_code中位于"|"和";"之间的内容。

    2、如果一条记录中有多个符合要求,分行,且保持其它字段内容一致。

    最终结果如下:

    二、测试代码

    数据库:sqlserver。(只对sqlserver有效,非标准sql语句)

    -- ---------------------------- -- Table structure for test_temp -- ---------------------------- IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[test_temp]') AND type IN ('U')) DROP TABLE [dbo].[test_temp] GO CREATE TABLE [dbo].[test_temp] ( [charge_code] varchar(256) COLLATE Chinese_PRC_CI_AS NULL, [exec_date] datetime NULL ) GO ALTER TABLE [dbo].[test_temp] SET (LOCK_ESCALATION = TABLE) GO -- ---------------------------- -- Records of [test_temp] -- ---------------------------- INSERT INTO [dbo].[test_temp] VALUES (N'士abcd大夫|123456;超声图文报告|5645;', N'2020-07-03 19:58:13.183') GO INSERT INTO [dbo].[test_temp] VALUES (N'士123ad大夫|126F3456;超声图as文报告|56qD45;', N'2020-07-03 19:58:39.863') GO INSERT INTO [dbo].[test_temp] VALUES (N'士123ad大夫|as125;', N'2020-07-03 20:32:10.560') GO -- ---------------------------- -- 查询结果进行比对 -- ---------------------------- SELECT * FROM test_temp; SELECT tab3.exec_date, --tab3.chargeCode, SUBSTRING(tab3.chargeCode, 0, CHARINDEX(';', tab3.chargeCode)) AS charge_code FROM ( SELECT tab1.exec_date, SUBSTRING(tab1.charge_code, tab2.number, CHARINDEX('|', tab1.charge_code + '|', tab2.number) - tab2.number) AS chargeCode, tab2.number FROM test_temp tab1 JOIN master..spt_values tab2 ON tab2.type = 'P' WHERE CHARINDEX('|', '|' + tab1.charge_code, tab2.number) = tab2.number AND tab2.number <> 1 ) tab3;

     

    Processed: 0.017, SQL: 9