SQL中移除字符串指定内容:提取u_manualdoc列的数字值
提取u_manualdoc列中的数字部分
嘿,这事儿好办!你要从u_manualdoc列里提取CGY DR#后面的数字,我给你分几种常见数据库的实现方法,按需选用就行~
核心思路
你的列值格式是固定的CGY DR# 数字,要么直接去掉固定前缀,要么用正则提取数字部分,两种方法各有优劣:
- 固定前缀法:高效直接,适合格式完全统一的场景
- 正则提取法:更灵活,能适配偶尔格式变化的情况
1. MySQL/MariaDB 实现
方法一:固定前缀截取
因为CGY DR# (注意末尾有空格)一共是8个字符,直接从第9位开始截取即可:
SELECT u_manualdoc, SUBSTRING(u_manualdoc, 9) AS extracted_number, cardcode, cardname FROM ODLN;
方法二:正则提取数字
如果担心偶尔有格式变动,用正则匹配所有数字更稳妥:
SELECT u_manualdoc, REGEXP_SUBSTR(u_manualdoc, '[0-9]+') AS extracted_number, cardcode, cardname FROM ODLN;
2. SQL Server 实现
方法一:固定前缀截取
同样利用固定前缀长度,用SUBSTRING截取:
SELECT u_manualdoc, SUBSTRING(u_manualdoc, 9, LEN(u_manualdoc)) AS extracted_number, cardcode, cardname FROM ODLN;
方法二:定位数字起始位置
用PATINDEX找到第一个数字的位置,再截取:
SELECT u_manualdoc, SUBSTRING(u_manualdoc, PATINDEX('%[0-9]%', u_manualdoc), LEN(u_manualdoc)) AS extracted_number, cardcode, cardname FROM ODLN;
3. Oracle 实现
方法一:定位最后一个空格截取
找到最后一个空格的位置,截取后面的内容:
SELECT u_manualdoc, SUBSTR(u_manualdoc, INSTR(u_manualdoc, ' ', -1) + 1) AS extracted_number, cardcode, cardname FROM ODLN;
方法二:正则提取数字
用正则匹配数字:
SELECT u_manualdoc, REGEXP_SUBSTR(u_manualdoc, '\d+') AS extracted_number, cardcode, cardname FROM ODLN;
小贴士:如果列中存在不符合
CGY DR# 数字格式的记录,可以用CASE WHEN做判断,避免出现异常值哦~
内容的提问来源于stack exchange,提问作者shiela
相关产品推荐
相关产品推荐

