1

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

我需要在WHERE Con​​dition中使用它。

前任。

000012345应该是12345012321应该是1232100012JY12应该是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:]]+)$', 
   '\1')=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+)?$'))
4

4 回答 4

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
于 2018-01-29T16:51:02.830 回答
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
);

结果:

色彩 | 新价值
----------+----------
000012345 | 12345
012321 | 12321
00012JY12 | 00012JY12
于 2018-01-29T16:48:41.053 回答
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在子句中使用 as 魔法值,default null on conversion error但这并没有什么害处,因为null输入将匹配THEN子句并null通过。

于 2018-01-29T18:33:29.333 回答
0

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

检查Oracle中的“它是否是一个数字”功能

您可以通过添加 0 来修剪数值的零,

示例代码:

--get  the IS_NUMERIC function from the link 

SELECT DECODE(IS_NUMERIC(col1), 'Y', col1+0, 'N', col1) 
  FROM your_table;
于 2018-01-30T01:30:40.373 回答