在列中,有一个以“0”开头的数字和字母数字值。 如果它是数字,如何修剪前导零,如果它是Oracle中的字母数字,则不应修剪零。
我需要在 WHERE条件中使用它。
实施例
000012345 应 12345 。 012321 应 12321 。 00012JY12 应 00012JY12 。
这就是我的尝试:
Result
答案 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
表达式的错误处理。
沿着那个:
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;