如果它是数字则修剪前导零,如果是字母数字则修剪前缀为零

时间:2018-01-29 16:40:58

标签: sql oracle oracle11g leading-zero character-trimming

在列中,有一个以“0”开头的数字和字母数字值。 如果它是数字,如何修剪前导零,如果它是Oracle中的字母数字,则不应修剪零。

我需要在 WHERE条件中使用它。

实施例

000012345 12345 012321 12321 00012JY12 00012JY12

这就是我的尝试:

Result

4 个答案:

答案 0 :(得分:6)

尽可能(在这种情况下),使用标准字符串函数,如SUBSTR,INSTR,TRANSLATE等,而不是正则表达式函数。正则表达式更强大,但也更耗时(正是出于这个原因),因此只有在真正需要时才能使用它们。

如果列名为str,则:

case when translate(str, 'z0123456789', 'z') is null
     then ltrim(str, '0')
     else str                      end

TRANSLATE会将z转换为自身,将所有数字转换为NULL,将所有其他字符转换为自身。 (唉,需要z或一些非数字字符。)

当且仅当TRANSLATE的结果为NULL时,输入为全数字。

演示:

select str, case when translate(str, 'z0123456789', 'z') is null
                 then ltrim(str, '0')
                 else str
            end  as new_str
from
(
  select '000012345' as str from dual union all
  select '012321'    as str from dual union all
  select '00012JY12' as str from dual
);

STR       NEW_STR 
--------- ---------
000012345 12345    
012321    12321    
00012JY12 00012JY12

答案 1 :(得分:3)

使用regexp_replace(col, '^0+([[:digit:]]+)$', '\1')

这将仅包含前导零和尾随数字的字符串替换仅有尾随数字的字符串,从而删除零。

示例查询:

select col, regexp_replace(col, '^0+([[:digit:]]+)$', '\1') as newvalue
from
(
  select '000012345' as col from dual
  union all
  select '012321' as col from dual
  union all
  select '00012JY12' as col from dual
);

结果:

COL       | NEWVALUE
----------+----------
000012345 | 12345
012321    | 12321
00012JY12 | 00012JY12

答案 2 :(得分:0)

如果您使用的是Oracle 12.2,则可以使用CAST表达式的错误处理。

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/CAST.html#GUID-5A70235E-1209-4281-8521-B94497AAEF75

沿着那个:

CASE WHEN CAST(<expression> AS NUMERIC DEFAULT NULL ON CONVERSION ERROR) IS NULL
     THEN <expression>
     ELSE TRIM(LEADING '0' FROM <expression>)
 END

<expression>替换为您的列名(或其他)。我在null子句中使用default null on conversion error作为魔术值,但这并没有坏处,因为null输入将匹配THEN子句并传递{{1}通过。

答案 3 :(得分:0)

您可以创建一个检查它是否为数字的函数,请参阅函数示例的此链接

check if "it's a number" function in Oracle

您只需向其添加0即可对数值的零进行TRIM,

示例代码:

--get  the IS_NUMERIC function from the link 

SELECT DECODE(IS_NUMERIC(col1), 'Y', col1+0, 'N', col1) 
  FROM your_table;