Trim 前导零如果是数字而不是 trim 零如果是字母数字
Trim leading zeroes if it is numeric and not trim zeroes if it is alphanumeric
在一列中,有以“0”开头的数字和字母数字值。
如果它是数字,如何 trim 前导零,如果它在 Oracle 中是字母数字,则不应该 trim 零。
我需要在WHERE条件中使用它。
例如
000012345 应该是 12345。
012321 应该是 12321。
00012JY12 应该是 00012JY12.
这是我试过的:
SELECT COUNT(*)
FROM <TABLE 1> ONN, <TABLE 2> SV
WHERE SV.CSA_SHP_VISIT_STG_SEQ_ID=ONN.CSA_SHOP_VIST_SEQ_ID
AND EXISTS (SELECT '1' FROM <TABLE 3> TMP
WHERE TRIM(SV.WORK_ORDER_NUM) = TRIM(TMP.WORK_ORDER_NUM)
AND PLANT IN ('EMA')
AND regexp_replace(TRIM(ONN.INSTLD_PART), '^0+([[:digit:]]+)$',
'')=TRIM(TMP.INSTLD_PART) AND
TRIM(ONN.INSTLD_PART_SERIAL_NUM)=TRIM(TMP.INSTLD_PART_SERIAL_NUM) AND
nvl(to_number(TRIM(ONN.INSTLD_PART_CSN)),0)=
nvl(to_number(TRIM(TMP.INSTLD_PART_CSN)),0)
and REGEXP_LIKE(tmp.INSTLD_PART_CSN, '^-?\d+(\.\d+)?$'))
使用regexp_replace(col, '^0+([[:digit:]]+)$', '')
.
这会将仅由前导零和尾随数字组成的字符串替换为尾随数字,从而删除了零。
示例查询:
select col, regexp_replace(col, '^0+([[:digit:]]+)$', '') 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
只要可能(在本例中是),请使用标准字符串函数,例如 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
如果您使用的是 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>
替换为您的列名(或其他名称)。我在 default null on conversion error
子句中使用 null
作为魔法值,但这没有坏处,因为 null
输入将匹配 THEN
子句并传递 null
通过.
您可以创建一个函数来检查它是否为数字,请参阅此 link 函数示例,
check if "it's a number" function in Oracle
你可以TRIM数值的零,只要给它加0,
示例代码:
--get the IS_NUMERIC function from the link
SELECT DECODE(IS_NUMERIC(col1), 'Y', col1+0, 'N', col1)
FROM your_table;
在一列中,有以“0”开头的数字和字母数字值。 如果它是数字,如何 trim 前导零,如果它在 Oracle 中是字母数字,则不应该 trim 零。
我需要在WHERE条件中使用它。
例如
000012345 应该是 12345。 012321 应该是 12321。 00012JY12 应该是 00012JY12.
这是我试过的:
SELECT COUNT(*)
FROM <TABLE 1> ONN, <TABLE 2> SV
WHERE SV.CSA_SHP_VISIT_STG_SEQ_ID=ONN.CSA_SHOP_VIST_SEQ_ID
AND EXISTS (SELECT '1' FROM <TABLE 3> TMP
WHERE TRIM(SV.WORK_ORDER_NUM) = TRIM(TMP.WORK_ORDER_NUM)
AND PLANT IN ('EMA')
AND regexp_replace(TRIM(ONN.INSTLD_PART), '^0+([[:digit:]]+)$',
'')=TRIM(TMP.INSTLD_PART) AND
TRIM(ONN.INSTLD_PART_SERIAL_NUM)=TRIM(TMP.INSTLD_PART_SERIAL_NUM) AND
nvl(to_number(TRIM(ONN.INSTLD_PART_CSN)),0)=
nvl(to_number(TRIM(TMP.INSTLD_PART_CSN)),0)
and REGEXP_LIKE(tmp.INSTLD_PART_CSN, '^-?\d+(\.\d+)?$'))
使用regexp_replace(col, '^0+([[:digit:]]+)$', '')
.
这会将仅由前导零和尾随数字组成的字符串替换为尾随数字,从而删除了零。
示例查询:
select col, regexp_replace(col, '^0+([[:digit:]]+)$', '') 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
只要可能(在本例中是),请使用标准字符串函数,例如 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
如果您使用的是 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>
替换为您的列名(或其他名称)。我在 default null on conversion error
子句中使用 null
作为魔法值,但这没有坏处,因为 null
输入将匹配 THEN
子句并传递 null
通过.
您可以创建一个函数来检查它是否为数字,请参阅此 link 函数示例,
check if "it's a number" function in Oracle
你可以TRIM数值的零,只要给它加0,
示例代码:
--get the IS_NUMERIC function from the link
SELECT DECODE(IS_NUMERIC(col1), 'Y', col1+0, 'N', col1)
FROM your_table;