2017-08-31 6 views
0

単語に任意の非数字文字がある場合は、単語全体を0に置き換える必要があります。たとえば、digital_word = '22B4'の場合は0に、そうでない場合はdigital_word = '224'に置き換えます。PL SQLは条件付きの提案を置き換えます

SELECT replace_funtion(digital_word,'has non numeric character pattern',0,digital_word) 
FROM dual; 

私は、デコード、REGEXP_INSTR、REGEXP_REPLACEを試みたが、適切なソリューションを考え出すことができませんでした。 お知らせください。

ありがとうございます。

+0

なぜこのために関数(PL/SQL)が必要ですか?あなたはそうしない! – mathguy

答えて

-1

次の更新クエリのようなものがお手伝いします:

update [table] set [col] = '0' 
where REGEXP_LIKE([col], '.*\D.*', 'i') 
+2

「更新」について誰が言ったのですか?正規表現に '。*'が必要なのはなぜですか?大文字小文字を区別しない比較が必要な理由 – mathguy

2

考え方は単純です - あなたは値が

数値またはないスクリプトであるかどうか確認が必要です。

with nums as 
(
select '123' as num from dual union all 
select '456' as num from dual union all 
select '7A9' as num from dual union all 
select '098' as num from dual 
) 
select n.* 
,nvl2(LENGTH(TRIM(TRANSLATE(num, ' +-.', ' '))),'0',num) 
from nums n 

結果

1 123 123 
2 456 456 
3 7A9 0 
4 098 098 

あなたは次のことを試してみてください

How can I determine if a string is numeric in SQL?

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:15321803936685

How to tell if a value is not numeric in Oracle?

+0

OPは「非数字」について話します。つまり、入力に+または「数字」を表すためにどのように使用できるかにかかわらず、「非数字」です。 – mathguy

2

あなたに優れている方法を参照するには、以下の記事を参照してください。

SELECT CASE WHEN REGEXP_LIKE(digital_word, '\D') THEN '0' ELSE digital_word END 
    FROM dual; 

正規表現のクラス\Dは任意の非数字文字と一致します。また、同じ効果に[^0-9]を使用することができます。

SELECT CASE WHEN REGEXP_LIKE(digital_word, '\D') THEN '0' ELSE digital_word END 
    FROM dual; 

代わりdigital_wordの値は数字に過ぎないので構成されている場合、あなたが見ることができる:

SELECT CASE WHEN REGEXP_LIKE(digital_word, '^\d+$') THEN digital_word ELSE '0' END 
    FROM dual; 

・ホープ、このことができます。

1

最速の方法は、すべての数字をnullで置き換えて(単純に削除する)何か残っているかどうかを確認することです。これには正規表現(slow!)は必要ありません。標準の文字列関数TRANSLATE()が必要です。

残念ながら、Oracleは独自の矛盾した処理NULLを回避する必要があります。 TRANSLATE()関数の場合、すべての数字を何も変換しないだけで済みます。また、3桁目の引数が空の文字列でないように、数字以外の文字を自分自身に変換する必要があります(です)。これはリレーショナル理論のようにNULLです。 TRANSLATE()機能については、Oracleのマニュアルを参照してください。https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions216.htm#SQLRF06145

そして、結果は、CASE式で求めることができる(又はNULL処理機能の様々な形; Iは、SQL標準である、CASEを好む):

with 
    nums (num) as (
     select '123' from dual union all 
     select '-56' from dual union all 
     select '7A9' from dual union all 
     select '0.9' from dual 
    ) 
-- End of simulated inputs (for testing only, not part of the solution). 
-- SQL query begins BELOW THIS LINE. Use your own table and column names. 
select num, 
     case when translate(num, 'z', 'z') is null 
      then num 
      else '0' 
     end as result 
from nums 
; 

NUM RESULT 
--- ------ 
123 123 
-56 0 
7A9 0 
0.9 0 

注:ここですべてはvarchar2データでありますタイプ(または他の種類の文字列データ型)を指定します。結果を数値に変換する必要がある場合は、ケースの式全体をTO_NUMBER()にラップします。また、文字列'-56''0.9'はすべて桁ではない(数字は含まれていません)ので、結果は両方とも'0'です。これが必要なものでない場合は、元の投稿の問題文を修正する必要があります。

関連する問題