pl / sql使用正则表达式有条件地替换表中字段的字符

时间:2013-10-10 16:57:45

标签: sql regex oracle

使用ORACLE sql developer 我有:
字段ID 1:'006789'
字段ID 2:'026789'
字段ID 3:'126789'

我想:
字段ID 1:'6789'
字段ID 2:'26789'
字段ID 3:'126789'

现居表“员工”

我想做这样的事情

begin
if FIELD_ID is like '00%' then
        update EMPLOYEES 
        set FIELD_ID = %s/\%1c..//
elseif FIELD_ID is like '0%' then
        update EMPLOYEES 
        set FIELD_ID = %s/\%1c.// 
endif;

我真的很擅长程序和正则表达式(显然)。

4 个答案:

答案 0 :(得分:3)

如果您需要从字符串中删除前导或尾随字符,则不需要正则表达式,TRIM函数就足够了。在Oracle中,那里 有三个功能,TRIMLTRIMRTRIM

要回答你的问题,

ltrim(field_id,'0')

trim(leading '0' from field_id)

应该有效。

另外,请注意TRIM和LTRIM / RTRIM之间存在细微差别。 TRIM只能使用一个修剪字符,而RTRIM / LTRIM可以占用很多。

答案 1 :(得分:1)

您可以使用单个更新语句(

)来完成此操作
UPDATE employees set field_id = ltrim(field_id, '0');

答案 2 :(得分:1)

不确定你为什么选择RegExp,但如果你只需要从字符串中删除前导和尾随字符,那么Oracle就具有TRIM功能。

TRIM(来自'123Tech111'的'1')将返回'23Tech'

example that fits your requirement

Oracle Documentation

答案 3 :(得分:0)

我意识到这是旧的,但另一种选择(因为源数据是带有前导零的数字),您可以将字符串转换为数字,然后返回字符串,如:to_char(to_number(field_id))

以下是一个例子:

WITH TST_DATA AS (
    SELECT '006789' FIELD_ID  FROM DUAL UNION ALL
    SELECT '026789' FIELD_ID  FROM DUAL UNION ALL
    SELECT '126789' FIELD_ID  FROM DUAL
)
SELECT TO_CHAR(TO_NUMBER(FIELD_ID)) FIELD_ID 
FROM TST_DATA
;
FIELD_ID
6789
26789
126789