SQL新手求助:提取CHAR/VARCHAR字段中的非零数字生成新ID
解决SQL中CHAR/VARCHAR字段提取非0数字生成新ID的问题
嘿,作为SQL新手碰到这种字符串处理的小难题太正常了!我来帮你搞定这个生成新ID的需求~
从你给出的示例(0000000001→1、00000123131→123131)来看,我猜你有两种可能的需求,下面分别给出对应解法,同时也会说明你之前用CHARINDEX和SUBSTRING没成功的原因:
需求1:仅移除前导零(保留中间/末尾的0,如果存在)
比如字段值是0010203,希望得到10203。这种情况适合用动态定位第一个非0字符的位置,或者用专门的修剪函数:
SQL Server
SELECT OriginalField, -- 处理全0的特殊情况,避免报错 CASE WHEN PATINDEX('%[^0]%', OriginalField) = 0 THEN '0' ELSE STUFF(OriginalField, 1, PATINDEX('%[^0]%', OriginalField) - 1, '') END AS NewID FROM YourTableName;
PATINDEX('%[^0]%', OriginalField):找到第一个非0字符的位置STUFF:从字符串开头截掉第一个非0字符之前的所有0
MySQL
SELECT OriginalField, -- 处理全0的特殊情况 IF(TRIM(LEADING '0' FROM OriginalField) = '', '0', TRIM(LEADING '0' FROM OriginalField)) AS NewID FROM YourTableName;
TRIM(LEADING '0' FROM ...):专门移除字符串开头的所有0
PostgreSQL
SELECT OriginalField, -- 处理全0的特殊情况 CASE WHEN LTRIM(OriginalField, '0') = '' THEN '0' ELSE LTRIM(OriginalField, '0') END AS NewID FROM YourTableName;
LTRIM(..., '0'):移除字符串左侧的所有0
需求2:完全移除所有0字符(仅保留非0数字)
比如字段值是0010203,希望得到123。这种情况直接用替换函数把所有0清空即可:
通用解法(适用于大多数SQL方言)
SELECT OriginalField, -- 处理全0的特殊情况,避免返回空字符串 CASE WHEN REPLACE(OriginalField, '0', '') = '' THEN '0' ELSE REPLACE(OriginalField, '0', '') END AS NewID FROM YourTableName;
REPLACE(OriginalField, '0', ''):把字段中所有的0替换为空字符串
为什么你之前用CHARINDEX和SUBSTRING没成功?
这两个函数需要你明确指定截取的起始位置或长度,但你的字段里前导零的个数是不固定的(有的是9个,有的是5个),没法用固定数值来定位。而上面的PATINDEX、TRIM/LTRIM、REPLACE都是动态处理任意长度的零,更适合你的场景。
内容的提问来源于stack exchange,提问作者user9469222
相关产品推荐
相关产品推荐

