SQL Server 2014:将LongText列冒号前后内容拆分为属性值两列
当然可以!要把这个包含属性-值对的LongText列拆分成Attribute和Value两列,咱们可以根据你使用的数据库来选择对应的实现方法,下面是几个主流数据库的具体方案:
1. SQL Server 实现方案(2016及以上版本)
因为你的属性对之间是用「, 」(逗号加空格)分隔的,而值里的逗号没有空格,所以我们可以先按这个分隔符拆分出每个单独的属性-值字符串,再拆分冒号前后的内容:
-- 示例表和数据,替换成你的实际表名和列名 DECLARE @YourTable TABLE (LongTextColumn LONGTEXT); INSERT INTO @YourTable VALUES ('TYPE: SOLID WEDGE 1,SOLID WEDGE 2, VALVE SIZE: 1 IN, PRESSURE RATING: 800 LB, CONNECTION TYPE: SOCKET WELD, BONNET STYLE: BOLTED'); SELECT -- 提取冒号前的属性名 TRIM(SUBSTRING(split_item, 1, CHARINDEX(': ', split_item) - 1)) AS Attribute, -- 提取冒号后的属性值 TRIM(SUBSTRING(split_item, CHARINDEX(': ', split_item) + 2, LEN(split_item))) AS Value FROM @YourTable -- 按「, 」拆分每个属性-值对 CROSS APPLY STRING_SPLIT(LongTextColumn, ', ') AS split_pairs -- 过滤掉可能的无效项 WHERE split_item LIKE '%: %';
2. MySQL 实现方案(8.0及以上版本)
MySQL可以借助JSON_TABLE来实现字符串拆分,先把原字符串转换成JSON数组,再拆分处理:
-- 替换成你的实际表和列 SET @long_text = 'TYPE: SOLID WEDGE 1,SOLID WEDGE 2, VALVE SIZE: 1 IN, PRESSURE RATING: 800 LB, CONNECTION TYPE: SOCKET WELD, BONNET STYLE: BOLTED'; SELECT TRIM(SUBSTRING(split_item, 1, LOCATE(': ', split_item) - 1)) AS Attribute, TRIM(SUBSTRING(split_item, LOCATE(': ', split_item) + 2)) AS Value FROM -- 把字符串转成JSON数组,拆分出每个属性-值对 JSON_TABLE( CONCAT('["', REPLACE(@long_text, ', ', '","'), '"]'), '$[*]' COLUMNS (split_item VARCHAR(255) PATH '$') ) AS split_pairs WHERE split_item LIKE '%: %';
3. PostgreSQL 实现方案
PostgreSQL用string_to_array和unnest组合来拆分字符串,再用SPLIT_PART拆分属性和值:
-- 替换成你的实际表和列 WITH your_table AS ( SELECT 'TYPE: SOLID WEDGE 1,SOLID WEDGE 2, VALVE SIZE: 1 IN, PRESSURE RATING: 800 LB, CONNECTION TYPE: SOCKET WELD, BONNET STYLE: BOLTED' AS long_text_column ) SELECT -- 按「: 」拆分取第一部分作为属性 TRIM(SPLIT_PART(split_item, ': ', 1)) AS Attribute, -- 按「: 」拆分取第二部分作为值 TRIM(SPLIT_PART(split_item, ': ', 2)) AS Value FROM your_table, -- 按「, 」拆分字符串并转成行 unnest(string_to_array(long_text_column, ', ')) AS split_item WHERE split_item LIKE '%: %';
注意事项
- 确保原字符串的格式是固定的:属性和值之间是「
:」(冒号加空格),属性对之间是「,」(逗号加空格),如果有格式不一致的情况,需要调整分隔符或者添加额外的处理逻辑。 - 如果是旧版本数据库(比如SQL Server 2016之前),可以用递归CTE来实现自定义字符串拆分功能。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

