如何在Microsoft SQL Server中将字段拆分为多列?药品列拆分求助
嘿,这个拆分需求挺典型的,我给你整理了几种常用工具的实现方法,你可以根据自己的使用场景来选:
方法1:Excel/Google Sheets 手动拆分
如果用表格工具处理,直接用内置函数就能搞定,假设原始数据在A列(从A2开始):
- Drugname(药物名):提取第一个空格前的内容,公式:
=LEFT(A2,FIND(" ",A2)-1) - Strength(剂量数值):提取字符串里的数字部分,通用公式(适配多位数):
=TEXTJOIN("",TRUE,IFERROR(MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1)*1,"")) - Units(单位):提取数字后的单位(比如mg),如果你的单位只有mg,可以用:
=MID(A2,FIND(TEXTJOIN("",TRUE,IFERROR(MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1)*1,"")),A2)+LEN(TEXTJOIN("",TRUE,IFERROR(MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1)*1,""))),2)
如果有多种单位(比如g、mcg),可以调整为:=MID(A2,MIN(FIND({"mg","g","mcg"},A2&"mggmcg")),LEN(MID(A2,MIN(FIND({"mg","g","mcg"},A2&"mggmcg")),3))-IF(ISNUMBER(MID(A2,MIN(FIND({"mg","g","mcg"},A2&"mggmcg"))+2,1)*1),1,0)) - Form(剂型):提取最后一个空格后的内容,公式:
=RIGHT(A2,LEN(A2)-FIND("~",SUBSTITUTE(A2," ","~",LEN(A2)-LEN(SUBSTITUTE(A2," ","")))))
方法2:Python Pandas 批量处理
如果是处理大量数据,用Python的Pandas结合正则表达式最灵活,代码示例:
import pandas as pd # 模拟你的数据表 df = pd.DataFrame({ 'DrugInfo': ['Sertraline 100mg tablets', 'Phenobarbitol 20mg capsules'] }) # 用正则表达式匹配拆分,每个括号对应一列 # 适配多种单位的正则:r'^(.+) (\d+)(mg|g|mcg) (\w+)$' pattern = r'^(\w+) (\d+)(mg) (\w+)$' df[['Drugname', 'Strength', 'Units', 'Form']] = df['DrugInfo'].str.extract(pattern) # 查看结果 print(df)
运行后就会直接生成你需要的四列,要是遇到药物名带空格的情况,把正则里的\w+改成.+就能适配。
方法3:SQL 数据库端拆分
如果数据存在数据库里(以MySQL 8.0+为例),可以用正则函数直接提取:
SELECT REGEXP_SUBSTR(DrugInfo, '^\\w+') AS Drugname, REGEXP_SUBSTR(DrugInfo, '\\d+') AS Strength, REGEXP_SUBSTR(DrugInfo, 'mg|g|mcg') AS Units, REGEXP_SUBSTR(DrugInfo, '\\w+$') AS Form FROM your_table_name;
要是用低版本MySQL(不支持正则提取),可以用字符串拼接函数拆分:
SELECT SUBSTRING_INDEX(DrugInfo, ' ', 1) AS Drugname, SUBSTRING_INDEX(SUBSTRING_INDEX(DrugInfo, ' ', 2), ' ', -1) AS Strength_With_Units, REGEXP_REPLACE(SUBSTRING_INDEX(DrugInfo, ' ', 2), '[^0-9]', '') AS Strength, REGEXP_REPLACE(SUBSTRING_INDEX(DrugInfo, ' ', 2), '[0-9]', '') AS Units, SUBSTRING_INDEX(DrugInfo, ' ', -1) AS Form FROM your_table_name;
注意事项
- 如果你的药物名存在多空格(比如
"Acetylsalicylic Acid 500mg tablets"),记得调整正则或公式里的匹配规则,比如把匹配药物名的部分改成匹配到数字前的所有内容。 - 单位如果有更多类型,一定要把所有可能的单位加到正则或查找列表里,避免提取失败。
内容的提问来源于stack exchange,提问作者HM8689
相关产品推荐
相关产品推荐

