从varchar sql developer中删除前导零

ola*_*ola 12 sql oracle

如何从varchar形式的数字中删除前导零.我尝试过以下方法:

选项1:

insert into example_table (columnName) 
    (SELECT
        SUBSTR(columnName2, InStr('%[^0 ]%', columnName2 + ' '), 10)
        from columnName2);
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到的错误是

SQL Error: ORA-01722: invalid number
ORA-02063: preceding line from xxxx
01722. 00000 -  "invalid number"
Run Code Online (Sandbox Code Playgroud)

选项2:

insert into example_table (columnName) 
    (SELECT
        SUBSTR(columnName2, InStr('%[^0 ]%', columnName2 + ' '),  
        LEN(columnName2))
     from columnName2);
Run Code Online (Sandbox Code Playgroud)

这次我得到了

Error at Command Line:23 Column:87
Error report:
SQL Error: ORA-00904: "LEN": invalid identifier
Run Code Online (Sandbox Code Playgroud)

选项3:

SUBSTRING
    (columnName2, PATINDEX('%[^0 ]%', columnName2 + ' '), 10));
Run Code Online (Sandbox Code Playgroud)

与上面类似,我得到了

Error at Command Line:23 Column:41
Error report:
SQL Error: ORA-00904: "PATINDEX": invalid identifier
00904. 00000 -  "%s: invalid identifier"
Run Code Online (Sandbox Code Playgroud)

编辑

我认为修剪路线可能是我最好的选择,但是...我不确定如何在我拥有的情况下使用它.

INSERT INTO temp_table
(columnNeedTrim, column2, column3, column4, column5) 
    SELECT * FROM
        (SELECT(
      SELECT TRIM(leading '0' from columnNeedTrim) FROM table),
            table.column2, 
            table2.column3,
                table.column4
                table.column5
        FROM
        table 
        INNER JOIN 
        table2 ON
            table1.columnNeedTrim=table2.columnNeedTrim) 
    WHERE NOT EXISTS (SELECT * FROM temp_table);
Run Code Online (Sandbox Code Playgroud)

我现在得到一个错误,因为我的trim函数返回多行结果.

Error report:
SQL Error: ORA-01427: single-row subquery returns more than one row
01427. 00000 -  "single-row subquery returns more than one row"
Run Code Online (Sandbox Code Playgroud)

我不确定如何在上面的陈述中使用修剪(或演员).对此有何帮助?谢谢你的帮助!

Ale*_*ole 36

Oracle具有TRIM字符串的内置函数.假设你有一个这样的字符串'00012345',你想保持它作为一个字符串,而不是将其转换为实际的NUMBER,你可以使用LTRIM功能与可选的第二个set,你修边零参数指定:

select ltrim('000012345', '0') from dual;

LTRIM
-----
12345
Run Code Online (Sandbox Code Playgroud)

如果您可能还有前导空格,您可以一次修剪:

select ltrim(' 00012345', '0 ') from dual;

LTRIM
-----
12345
Run Code Online (Sandbox Code Playgroud)

您也可以转换为数字并返回,但这似乎很多工作,除非您有其他格式要删除:

select to_char(to_number('000012345')) from dual;
Run Code Online (Sandbox Code Playgroud)

顺便提一下,你第一次尝试获得ORA-01722的直接原因是你使用的是数字+运算符而不是Oracle的字符串集合运算符||.它正在将您的字符串隐式转换为数字,这似乎是您试图避免的,并且单个空间的隐式转换 - 无论是什么 - 都会导致错误.(实际上,你的某些值可能根本不是数字 - 为数字应该存储在NUMBER字段中的另一个例子;如果是这种情况,那么转换(或转换)为数字并返回仍然会得到ORA- 01722).你会得到同样的事情在第二次尝试,如果你使用LENGTH的不是LEN.无论如何都不会工作,因为INSTR不能识别正则表达式.你可以REGEXP_INSTR改用,但是REGEXP_REPLACE如果你想沿着这条路走下去,那么你最好使用@ schurik的版本.


我不确定我理解你的问题编辑.看起来您的插入可以简化为:

INSERT INTO temp_table (columnNeedTrim, column2, column3, column4, column5)
SELECT LTRIM(table1.columnNeedTrim, '0 '),
    table1.column2,
    table1.column3,
    table1.column4,
    table1.column5
FROM table1
INNER JOIN table2 ON table2.columnNeedTrim = table1.columnNeedTrim
WHERE NOT EXISTS (
    SELECT * FROM temp_table
    WHERE columnNeedTrim = LTRIM(t42.columnNeedTrim, '0 '));
Run Code Online (Sandbox Code Playgroud)

(我不明白为什么你在你的版本中做一个子查询,或者为什么你从另一个子查询中得到修剪后的值.)

你也可以使用MERGE:

MERGE INTO temp_table tt
USING (
    SELECT LTRIM(t42.columnNeedTrim, '0 ') AS columnNeedTrim,
        t42.column2,
        t42.column3,
        t42.column4,
        t42.column5
    FROM t42 
    INNER JOIN t43 ON t43.columnNeedTrim=t42.columnNeedTrim
) sr
ON (sr.columnNeedTrim = tt.columnNeedTrim)
WHEN NOT MATCHED THEN
INSERT (tt.columnNeedTrim, tt.column2, tt.column3, tt.column4, tt.column5)
VALUES (sr.columnNeedTrim, sr.column2, sr.column3, sr.column4, sr.column5);
Run Code Online (Sandbox Code Playgroud)