TSQL如何提取字段中特定字符右侧的纯数字内容
处理方案
以下按不同主流数据库提供实现代码,可直接替换到你的查询逻辑中:
SQL Server(适配你当前使用的CHARINDEX/SUBSTRING语法体系)
如果你的数据库版本为SQL Server 2017及以上,优先用以下两种方案:
- 方案1(非数字仅出现在末尾时效率最高):
通过PATINDEX定位第一个非数字字符的位置,直接截取数字段,末尾追加非数字字符避免全数字场景下匹配为空报错:
SELECT SUBSTRING(DatabaseField, 0, CHARINDEX('-', DatabaseField)) AS NewColumnA, SUBSTRING( SUBSTRING(DatabaseField, CHARINDEX('-', DatabaseField)+1, LEN(DatabaseField)), 1, PATINDEX('%[^0-9]%', SUBSTRING(DatabaseField, CHARINDEX('-', DatabaseField)+1, LEN(DatabaseField)) + 'X') - 1 ) AS NewColumnB FROM 你的表名
- 方案2(非数字可能出现在任意位置时适用):
通过TRANSLATE批量替换所有大小写字母为空:
SELECT SUBSTRING(DatabaseField, 0, CHARINDEX('-', DatabaseField)) AS NewColumnA, TRIM(TRANSLATE( SUBSTRING(DatabaseField, CHARINDEX('-', DatabaseField)+1, LEN(DatabaseField)), 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', REPLICATE(' ', 52) )) AS NewColumnB FROM 你的表名
其他主流数据库实现
MySQL(8.0及以上)
SELECT SUBSTRING_INDEX(DatabaseField, '-', 1) AS NewColumnA, REGEXP_REPLACE(SUBSTRING_INDEX(DatabaseField, '-', -1), '[^0-9]', '') AS NewColumnB FROM 你的表名
PostgreSQL
SELECT SPLIT_PART(DatabaseField, '-', 1) AS NewColumnA, REGEXP_REPLACE(SPLIT_PART(DatabaseField, '-', 2), '[^0-9]', '', 'g') AS NewColumnB FROM 你的表名
Oracle
SELECT SUBSTR(DatabaseField, 1, INSTR(DatabaseField, '-') - 1) AS NewColumnA, REGEXP_REPLACE(SUBSTR(DatabaseField, INSTR(DatabaseField, '-') + 1), '[^0-9]') AS NewColumnB FROM 你的表名
内容的提问来源于stack exchange,提问作者MISNole
相关产品推荐
相关产品推荐

