如何从SQL列中提取方括号内两值并拆分至不同列?
拆分NAME列的实现方案
针对将包含[数字 文本]格式的NAME列拆分为三列的需求,可通过字符串处理函数实现,以下是主流数据库的具体写法:
核心逻辑
- 提取方括号前的纯名称:截取字符串到
[的位置 - 提取方括号内的数字部分:匹配方括号内空格前的数值(支持小数)
- 提取方括号内的文本部分:匹配方括号内空格后的文本(支持带点号的格式)
MySQL/MariaDB
使用SUBSTRING_INDEX和REGEXP_SUBSTR函数:
SELECT TRIM(SUBSTRING_INDEX(NAME, '[', 1)) AS `NAME`, TRIM(REGEXP_SUBSTR(NAME, '[0-9.]+', 1, 1)) AS `NAME 1`, TRIM(REGEXP_SUBSTR(NAME, '[a-zA-Z.]+', 1, 2)) AS `NAME 2` FROM your_table;
说明:SUBSTRING_INDEX截取[前的内容,REGEXP_SUBSTR分别匹配第一个数值(含小数点)和第二个字母/点号组成的文本,TRIM去除多余空格。
SQL Server
使用CHARINDEX、SUBSTRING和PATINDEX:
SELECT TRIM(SUBSTRING(NAME, 1, CHARINDEX('[', NAME) - 1)) AS [NAME], TRIM(SUBSTRING(NAME, CHARINDEX('[', NAME) + 1, PATINDEX('% [^0-9.]%', NAME) - CHARINDEX('[', NAME) - 1)) AS [NAME 1], TRIM(SUBSTRING(NAME, PATINDEX('% [^0-9.]%', NAME) + 1, CHARINDEX(']', NAME) - PATINDEX('% [^0-9.]%', NAME) - 1)) AS [NAME 2] FROM your_table;
说明:通过CHARINDEX定位[和]的位置,PATINDEX找到数字与文本之间的空格位置,再用SUBSTRING截取对应片段。
PostgreSQL
使用SPLIT_PART和REGEXP_MATCH:
SELECT TRIM(SPLIT_PART(NAME, '[', 1)) AS "NAME", TRIM((REGEXP_MATCH(NAME, '\[(\d+\.*\d*) ')::TEXT[])[1]) AS "NAME 1", TRIM((REGEXP_MATCH(NAME, ' (\w+\.*\w*)\]')::TEXT[])[1]) AS "NAME 2" FROM your_table;
说明:SPLIT_PART拆分出方括号前的名称,REGEXP_MATCH通过正则捕获组提取方括号内的数字和文本,再取出对应组的内容。
内容的提问来源于stack exchange,提问作者Trisfocle
相关产品推荐
相关产品推荐

