如何用T-SQL移除表中字段末尾的(###)格式内容?
需求:移除字段末尾的
(数字)格式内容 我的表中存在如下格式的字段值:
Name ______ Name(122) anotherName(12312) Another2Name(12321) Name(2)Name(123213)
希望将其转换为如下格式:
Name ______ Name anotherName Another2Name Name(2)Name
此前尝试过移除括号后的所有内容,但部分字段值本身包含括号;也尝试过移除所有数字,但会误删字段内的合法数字(如Another2Name中的2),请问如何编写查询语句或更新表来实现需求?
解决方案
MySQL/MariaDB
利用正则表达式替换函数REGEXP_REPLACE,精准匹配字符串末尾的(一串数字)格式内容并替换为空:
查询验证语句:
SELECT original_column, REGEXP_REPLACE(original_column, '\\([0-9]+\\)$', '') AS processed_column FROM your_table;
更新表语句:
UPDATE your_table SET original_column = REGEXP_REPLACE(original_column, '\\([0-9]+\\)$', '');
SQL Server
SQL Server 2017及以上版本支持REGEXP_REPLACE,写法如下:
查询验证语句:
SELECT original_column, REGEXP_REPLACE(original_column, '\([0-9]+\)$', '') AS processed_column FROM your_table;
更新表语句:
UPDATE your_table SET original_column = REGEXP_REPLACE(original_column, '\([0-9]+\)$', '');
如果是不支持正则的旧版本SQL Server,可通过字符串函数组合实现:
SELECT original_column, CASE WHEN RIGHT(original_column, 1) = ')' AND CHARINDEX('(', REVERSE(original_column)) > 0 THEN LEFT(original_column, LEN(original_column) - CHARINDEX('(', REVERSE(original_column))) ELSE original_column END AS processed_column FROM your_table;
PostgreSQL
使用REGEXP_REPLACE实现需求:
查询验证语句:
SELECT original_column, REGEXP_REPLACE(original_column, '\([0-9]+\)$', '') AS processed_column FROM your_table;
更新表语句:
UPDATE your_table SET original_column = REGEXP_REPLACE(original_column, '\([0-9]+\)$', '');
正则规则说明
正则表达式\([0-9]+\)$的作用:
\(:转义匹配左括号(括号在正则中是特殊字符,需转义)[0-9]+:匹配1个或多个连续数字\):转义匹配右括号$:限定匹配位置为字符串末尾,确保只移除最后一段的(数字)内容,不会影响字段中间的合法括号(比如Name(2)Name里的(2)会被保留)
内容的提问来源于stack exchange,提问作者Nitish Mehta
相关产品推荐
相关产品推荐

