OracleにはTRIM
が組み込まれています 文字列の関数。 '00012345'
のような文字列があると仮定します 実際のNUMBER
に変換するのではなく、文字列として保持したい場合 、LTRIM
を使用できます オプションの2番目の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
に格納する必要がある理由のもう1つの例です。 田畑;その場合は、数値に変換(またはキャスト)してから元に戻すと、ORA-01722が得られます)。 LENGTH
を使用している場合は、2回目の試行でも同じ結果が得られます。 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);