2013-07-15 100 views
9

我该如何从一个varchar形式的数字中删除前导零。 我曾尝试以下:从varchar中删除前导零sql开发者

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

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

Error report: 
SQL Error: ORA-01427: single-row subquery returns more than one row 
01427. 00000 - "single-row subquery returns more than one row" 

我不知道如何在上面的语句中使用trim(或cast)。对此有何帮助? 感谢您的帮助!

+0

这是否也适用于SQL Server 2008?你把它标记为这样,但那只是被其他人删除。 – JNK

+0

它是为SQL开发人员...并不意味着标记为服务器2008 – ola

回答

26

Oracle已经内置TRIM函数的字符串。假设你有一个像'00'一个字符串,并要保持它作为一个字符串,而不是将其转换为实际NUMBER,您可以使用LTRIM function与可选的第二个参数set指定你修边零:

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

LTRIM 
----- 
12345 

如果您还可能有前导空格就可以一气呵成修剪两个:

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

LTRIM 
----- 
12345 

你也可以转换为数字和背部,但是这似乎是一个大量的工作,除非你有,你想其他格式剥离:

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

顺便说一句,直接原因你得到ORA-01722从你的第一次尝试是,你正在使用的数字+操盘Oracle的字符串concentenation运营商||。它将你的字符串隐式转换为一个数字,这似乎是你想要避免的,并且单个空间的隐式转换 - 无论是为了什么 - 导致了错误。 (可能有些值实际上并不是数字 - 另一个例子说明为什么数字应该存储在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); 
+0

我发现了这个,同时做了一些更多的研究...但是我想出现另一个错误...我要发布结果的编辑... – ola

+0

@ user1998581 - 我想我可能会错过重要的东西,或者问题是缺少的东西,但我已经添加了一个更简单的插入语句... –

+0

我从两个不同的表(表1和表2,并插入它们的联接(因为我需要它们在一行中)只有它不存在的值temp_table alraedy ...我必须采取一列(columnNeedTrim)和修剪前导零,因为temp_table中的值已修剪...因此它不能识别数字是否相同,因为一个具有前导零和一个不......这是否有意义? – ola

1

对于SQL服务器,如果您知道数据实际上是一个数字,那么您只需投它两次。投到int删除前导零,然后回到一个字符串插入。我假设你可以在Oracle中做类似的事情。

DECLARE @vc varchar(100) = '00000000000000000000' 

SELECT CAST(CAST(@vc as int) as varchar(100)) 

返回:

1234 
+0

我将如何应用到整个行不只是一个变量? – ola

+0

这又给了我无效的数字错误... – ola

+0

你得到无效的数字,因为你的值不是一个整数。 – SQLMason

1

你不必来取代它。它将由Oracle处理。

SELECT TO_NUMBER(num) 
FROM 
(
     SELECT '00000123' AS num FROM DUAL 
); 

-- Result: 
-- 123 
+0

除非他有一个领先的空间或什么 - 我猜他从@JNK的其他评论回答 – SQLMason

+1

@DanAndrews - 领先的空间不会是一个问题,但不清楚是否有其他的价值观, t完全代表数字,因此会生成ORA-01722。 –