sql - 从varchar SQL Developer中删除前导零

标签 sql oracle

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

选项1:

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


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

SQL Error: ORA-01722: invalid number
ORA-02063: preceding line from xxxx
01722. 00000 -  "invalid number"


选项2:

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


这次我得到

Error at Command Line:23 Column:87
Error report:
SQL Error: ORA-00904: "LEN": invalid identifier


选项3:

SUBSTRING
    (columnName2, PATINDEX('%[^0 ]%', columnName2 + ' '), 10));


与上面类似,我得到

Error at Command Line:23 Column:41
Error report:
SQL Error: ORA-00904: "PATINDEX": invalid identifier
00904. 00000 -  "%s: invalid identifier"


编辑

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

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);


现在出现错误,因为我的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"


我不确定如何对上面的陈述进行修饰(或强制转换)。有什么帮助吗?
谢谢你的帮助!

最佳答案

Oracle对字符串具有内置的TRIM函数。假设您有一个像'00012345'这样的字符串,并且希望将其保留为字符串,而不是将其转换为实际的NUMBER,则可以将LTRIM function与可选的第二个set参数一起使用,以指定要修剪的参数零:

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

LTRIM
-----
12345


如果您还可能有前导空格,则可以一次性进行调整:

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

LTRIM
-----
12345


您也可以转换成数字然后返回,但是除非您想去除其他格式,否则这似乎需要做很多工作:

select to_char(to_number('000012345')) from dual;




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



我不确定我是否理解您的问题编辑。看来您的插入内容可以简化为:

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 '));


(我不明白为什么您要在您的版本中执行子查询,或者为什么要从另一个子查询中获取修剪后的值。)

您也可以使用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);

关于sql - 从varchar SQL Developer中删除前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656790/

相关文章:

MySql 更新无法识别临时表

.net - 证明 SQL 注入(inject)

sql - PostgresQL 外键语法错误

sql - Oracle SQL 分层查询以了解两个元素之间的路径

oracle - 有没有快速的方法来清除 Oracle AQ 中的异常队列?

sql - oracle sql错误-缺少右括号

sql - Oracle 游标表达式与标准连接

MySQL - 想要从两个 SELECT 语句中减去两个 SUM() 值

mysql - 连接问题

Java 准备好的语句抛出 SQLIntegrityConstraintViolationException : Invalid argument(s) in call