PostgreSQL解析值:如何提取机构捐赠者条目至新列?
解决方案:分离数据库中的个人与机构捐赠者
当然可以!这是处理捐赠类数据库时非常常见的需求——咱们完全可以通过模式匹配识别带有特殊标识的机构名称,把它们提取到新列里。下面针对几种主流数据库给出具体的实现步骤:
一、先准备新列(通用前置步骤)
首先你需要给表添加两个新列:一个标记是否为机构(后续查询会更方便),另一个专门存储机构名称。如果只需要提取机构名称到新列,也可以只加后者。
以表名为donations为例,先看通用的列添加逻辑(不同数据库语法略有差异,下面会细化):
二、分数据库具体实现
MySQL/MariaDB
- 添加新列:
ALTER TABLE donations ADD COLUMN is_organization BOOLEAN DEFAULT FALSE, ADD COLUMN organization_name VARCHAR(255);
- 匹配特殊字符并更新数据:
UPDATE donations SET is_organization = TRUE, organization_name = donor_name WHERE donor_name REGEXP 'LLC|&|Inc\\.';
小贴士:正则里的
.是通配符,所以要加\\转义;如果想更精准(避免误匹配名字里带"Inc"的个人),可以改成匹配带空格的标识,比如' LLC | & | Inc\\. '
PostgreSQL
- 添加新列:
ALTER TABLE donations ADD COLUMN is_organization BOOLEAN DEFAULT FALSE, ADD COLUMN organization_name VARCHAR(255);
- 不区分大小写匹配并更新:
UPDATE donations SET is_organization = TRUE, organization_name = donor_name WHERE donor_name ~* 'LLC|&|Inc\\.';
~*表示不区分大小写匹配,能覆盖比如"llc"、"INC."这类大小写不一致的情况
SQL Server
- 添加新列:
ALTER TABLE donations ADD is_organization BIT DEFAULT 0, ADD organization_name VARCHAR(255);
- 用LIKE匹配更新:
UPDATE donations SET is_organization = 1, organization_name = donor_name WHERE donor_name LIKE '%LLC%' OR donor_name LIKE '%&%' OR donor_name LIKE '%Inc.%';
或者用更灵活的PATINDEX:
UPDATE donations SET is_organization = 1, organization_name = donor_name WHERE PATINDEX('%LLC%', donor_name) > 0 OR PATINDEX('%&%', donor_name) > 0 OR PATINDEX('%Inc.%', donor_name) > 0;
三、重要注意事项
- 先测试再更新:在执行
UPDATE之前,先运行SELECT语句验证匹配结果,比如:
确保没有误匹配后再执行更新,避免数据错误。SELECT donor_name FROM donations WHERE donor_name REGEXP 'LLC|&|Inc\\.'; -- MySQL示例 - 扩展匹配规则:如果还有其他机构标识(比如"Corp"、"Ltd"),直接在正则或LIKE条件里补充即可。
- 处理个人名称:如果需要把个人捐赠者的名称也放到单独列,只需要用反向条件(比如
NOT REGEXP)更新对应的列就行。
内容的提问来源于stack exchange,提问作者liz
相关产品推荐
相关产品推荐

