SQL实现单行多字符串拆分入表及多字符串合并存入单行方法
SQL 字符串拆分与结构化拼接实现
按换行拆分字符串为逐行结果
核心逻辑是指定换行符作为分隔符,调用数据库内置的字符串拆分能力处理,注意提前替换Windows格式文本里的\r回车符,避免拆分出空行。
以下是主流数据库可直接运行的实现代码:
- MySQL 8.0+ 版本(用递归CTE实现,兼容所有8.0以上环境)
-- 定义待拆分的原始字符串 SET @raw_str = 'tax company name branch #1-0 123456789123456 2022-05-14 01:51:09 38.75 5.05 10-1 / B Y29tcGFueSBuYW1lIGJyYW5jaCAjMS0wCjEyMzQ1Njc4OTEyMzQ1NgoyMDIyLTA1LTE0IDAxOjUxOjA5CjM4Ljc1CjUuMDUKMTAtMSAvIEI='; -- 统一清理回车符 SET @raw_str = REPLACE(@raw_str, '\r', ''); WITH RECURSIVE split_cte AS ( SELECT 1 AS line_no, SUBSTRING_INDEX(@raw_str, '\n', 1) AS line_content, SUBSTRING(@raw_str, LENGTH(SUBSTRING_INDEX(@raw_str, '\n', 1)) + 2) AS remain_str UNION ALL SELECT line_no + 1, SUBSTRING_INDEX(remain_str, '\n', 1), SUBSTRING(remain_str, LENGTH(SUBSTRING_INDEX(remain_str, '\n', 1)) + 2) FROM split_cte WHERE remain_str != '' ) SELECT line_content FROM split_cte;
- PostgreSQL 版本
SELECT unnest(string_to_array( replace( 'tax company name branch #1-0 123456789123456 2022-05-14 01:51:09 38.75 5.05 10-1 / B Y29tcGFueSBuYW1lIGJyYW5jaCAjMS0wCjEyMzQ1Njc4OTEyMzQ1NgoyMDIyLTA1LTE0IDAxOjUxOjA5CjM4Ljc1CjUuMDUKMTAtMSAvIEI=', E'\r', '' ), E'\n' )) AS line_content;
- SQL Server 2016+ 版本
DECLARE @raw_str NVARCHAR(MAX) = 'tax company name branch #1-0 123456789123456 2022-05-14 01:51:09 38.75 5.05 10-1 / B Y29tcGFueSBuYW1lIGJyYW5jaCAjMS0wCjEyMzQ1Njc4OTEyMzQ1NgoyMDIyLTA1LTE0IDAxOjUxOjA5CjM4Ljc1CjUuMDUKMTAtMSAvIEI='; SET @raw_str = REPLACE(@raw_str, CHAR(13), ''); SELECT value AS line_content FROM STRING_SPLIT(@raw_str, CHAR(10)) WHERE RTRIM(value) != '';
如果拆分后需要映射到结构化字段,直接用拆分时生成的行号匹配即可,示例中8行内容顺序固定,按行号取值就能对应到各个业务字段。
拆分效果参考:
多值拼接为结构化JSON字符串存入单行
你需要存储的是标准JSON格式结构,禁止手动用字符串拼接函数拼JSON格式,一旦字段值里出现双引号、反斜杠、换行符等特殊字符,会直接导致JSON格式非法,后续无法解析。所有主流数据库都提供了内置的JSON构造函数,会自动处理特殊字符转义,直接调用即可。
以下是主流数据库插入JSON格式数据的示例:
- MySQL 版本
INSERT INTO invoice_table (invoice_data) VALUES ( JSON_OBJECT( 'SellerName', 'company name branch #1-0', 'SellerTaxId', '123456789123456', 'SellerTimeStamp', '2022-05-14 01:51:09', 'TotalInvoiceIncludingTax', '38.75', 'TotalTax', '5.05', 'InvoiceNo', '10-1 / B', 'QRCode', 'Y29tcGFueSBuYW1lIGJyYW5jaCAjMS0wCjEyMzQ1Njc4OTEyMzQ1NgoyMDIyLTA1LTE0IDAxOjUxOjA5CjM4Ljc1CjUuMDUKMTAtMSAvIEI=' ) );
- PostgreSQL 版本
INSERT INTO invoice_table (invoice_data) VALUES ( json_build_object( 'SellerName', 'company name branch #1-0', 'SellerTaxId', '123456789123456', 'SellerTimeStamp', '2022-05-14 01:51:09', 'TotalInvoiceIncludingTax', '38.75', 'TotalTax', '5.05', 'InvoiceNo', '10-1 / B', 'QRCode', 'Y29tcGFueSBuYW1lIGJyYW5jaCAjMS0wCjEyMzQ1Njc4OTEyMzQ1NgoyMDIyLTA1LTE0IDAxOjUxOjA5CjM4Ljc1CjUuMDUKMTAtMSAvIEI=' ) );
- SQL Server 版本
INSERT INTO invoice_table (invoice_data) VALUES ( JSON_OBJECT( 'SellerName' : 'company name branch #1-0', 'SellerTaxId' : '123456789123456', 'SellerTimeStamp' : '2022-05-14 01:51:09', 'TotalInvoiceIncludingTax' : '38.75', 'TotalTax' : '5.05', 'InvoiceNo' : '10-1 / B', 'QRCode' : 'Y29tcGFueSBuYW1lIGJyYW5jaCAjMS0wCjEyMzQ1Njc4OTEyMzQ1NgoyMDIyLTA1LTE0IDAxOjUxOjA5CjM4Ljc1CjUuMDUKMTAtMSAvIEI=' ) );
存入效果参考:
内容的提问来源于stack exchange,提问作者Mohammed Abdelrahman
相关产品推荐
相关产品推荐

