2013-07-15 29 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。 –