SQL中如何提取特定字符后的子串替换原有字段值?
不同数据库下的实现方案
核心逻辑是先定位/符号在字符串中的位置,再截取该位置之后的所有内容即可。如果存在部分值没有/的场景,可以额外加判断逻辑保留原值,避免执行出错。
各数据库具体实现
MySQL
- 仅查询不修改原有数据:
SELECT SUBSTRING_INDEX(字段名, '/', -1) AS 处理后字段 FROM 表名;
- 直接修改表中原有值(执行前建议先备份数据):
UPDATE 表名 SET 字段名 = SUBSTRING_INDEX(字段名, '/', -1);
注:
SUBSTRING_INDEX的第三个参数为-1表示取最后一个分隔符之后的内容,就算值里有多个/也能取到最后一段。
PostgreSQL
- 查询:
SELECT SPLIT_PART(字段名, '/', -1) AS 处理后字段 FROM 表名;
- 更新:
UPDATE 表名 SET 字段名 = SPLIT_PART(字段名, '/', -1);
SQL Server
- 查询:
SELECT RIGHT(字段名, LEN(字段名) - CHARINDEX('/', 字段名)) AS 处理后字段 FROM 表名;
- 更新:
UPDATE 表名 SET 字段名 = RIGHT(字段名, LEN(字段名) - CHARINDEX('/', 字段名)) WHERE CHARINDEX('/', 字段名) > 0;
注:加WHERE条件是为了跳过没有
/的行,避免修改出错。
Oracle
- 查询:
SELECT SUBSTR(字段名, INSTR(字段名, '/') + 1) AS 处理后字段 FROM 表名;
- 更新:
UPDATE 表名 SET 字段名 = SUBSTR(字段名, INSTR(字段名, '/') + 1) WHERE INSTR(字段名, '/') > 0;
特殊场景处理
如果字段值可能不存在/,需要保留原值的话,可以加判断函数,比如MySQL里用IF实现:
SELECT IF(LOCATE('/', 字段名) > 0, SUBSTRING_INDEX(字段名, '/', -1), 字段名) AS 处理后字段 FROM 表名;
内容的提问来源于stack exchange,提问作者Minos
相关产品推荐
相关产品推荐

