2017-12-20 8 views
0

データ型varcharのデータベースと列(y)にテーブル(x)があります。この列には、1.、2 \、.5,2]、4.3などの値が含まれています。Oracleのvarchar文字列の置換

ドットの後に値を持つもの以外の特殊文字を持つ列のすべての値を置き換えようとしています。

例:2.3,4.5,7.1のような値を置き換えたくありません。

ドットの後に値がない場合や、ドットで始まる値がドットをnullに置き換えたい場合は、

例:2. 1と交換する必要があります

  • 1.、2。
  • 0.1、0.2は、同様に1、2と交換する必要があります。

助けてください私は、スクリプトの下にしようとしたが、それは

update <table_name> 
set <column_name> = regexp_replace(regexp_replace(column_name, '[^A-Z0-9 ]', '.'), 
               ' {2,}', ' ') 
/

を動作しませんでした。

私はOracle 11g DBを使用しています。

+0

私は理解できません...あなたが表示する文字列、 '1。 、2 \、.5,2]、4.3'は単一の入力文字列です(単一の行にあります)?結果はコンマで区切られた数値のリストでなければなりません。整数か小数のどちらかですか?そして、私はなぜあなたが '23'を' 23'に置き換えたいのか理解しています。しかし、なぜ '.2'を' 0.2'ではなく '' 2''に置き換えたいのですか?多くの国では '.2'が' 0.2'の共通の変種であることをご存知ですか?あなたが言ったように**本当に** .2を2​​に置き換えたいとしていることを確認してください。あなたは問題のステートメントを変更するために戻ってこないでしょう。 – mathguy

+0

小数点以外のすべての特殊文字をコンマで区切ります。文字列に文字列が存在することはありますか?そうであれば、どのように扱う必要がありますか?次に、入力文字列に '....、32.9.2、....'のようなものがあればどうしますか? (2小数点以下は?)記号については、 '2。 、30 $、+ 12.5、-42.23?それらをどのように処理する必要がありますか? – mathguy

+0

@mathguy文字列がSINGLE入力文字列ではありません。私が言及した各文字列は、新しい値が連続しています。私が.2を0.2でなく2で置き換えることを試みているのは、実際の値が2である理由です。いくつかの値のデータ移行中に、数値の前にドットが追加されています。はい、すべての特殊文字を削除します。文字列には文字はありません。私は2つの小数点文字列を持っていません。 +、 - 、$記号もヌル値に置き換えてください。 –

答えて

2

これは片道です。最初に、正規表現関数を使用して、数字とピリオド以外のすべての文字を削除します。次に、TRIMを結果に適用して、ピリオドが最初または最後の文字である場合にのみトリム(削除)します。

WITH句はクエリの一部ではありません。自分でテストデータを作成するだけです。実際の表と列の名前を使用して(SELECT ...からの)問合せを使用してください。

with 
    inputs (str) as (
    select '2.' from dual union all 
    select '-4.2' from dual union all 
    select '3?*' from dual union all 
    select '32.' from dual union all 
    select '.3' from dual union all 
    select '5$8' from dual 
) 
select str, trim('.' from regexp_replace(str, '[^0-9.]')) as new_str 
from inputs 
; 

STR NEW_STR 
---- ------- 
2. 2 
-4.2 4.2 
3?* 3 
32. 32 
.3 3 
5$8 58 
+0

出来た。ありがとうmathguy –