2016-05-13 23 views
0

文字列から通り名を引き出すクエリ(sql)があります。それは、数字の最後のオカレンスを探していて、先のテキストを通りの名前として引っ張っています。私は、「範囲外である 『0』引数」引数 '0'が範囲外エラーです

エラーをオラクル

を得続けるが、私はそれを修正する方法を見つけ出すのに苦労しています。

問題のクエリの一部は、任意のヘルプは素晴らしいだろう

substr(address,regexp_instr(address,'[[:digit:]]',1,regexp_count(address,'[[:digit:]]'))+2) 

です。

+0

をたぶん、あなたはそう、何の数字を持っていない対処カウントは0になります。あなたは文字列と希望の出力を開始する例を投稿していただけますか? – Aleksej

+0

それはまさにそれでした。文字列に数字があることを確認するために句を追加すると、エラーは消えてしまいました。本当にありがとう! – Jenny

答えて

1

(SQL現像剤を使用して)regexp_instrの第四パラメータが発生である:

発生は、Oracleで検索するSOURCE_STRINGにおける パターンのどの発生を示す正の整数です。デフォルトは1、 で、Oracleはpatternの最初のオカレンスを検索します。

この場合、アドレスに数字が含まれていない場合、regexp_countは0を返します。これは有効ではありません。

0

家屋番号なしでアドレス用の別の治療を必要としない簡単な解決策は、これです:

with t (address) as (
     select '422 Hickory Str.' from dual union all 
     select 'One US Bank Plaza' from dual 
    ) 
select regexp_substr(address, '\s*([^0-9]*)$', 1, 1, null, 1) as street from t; 

出力は次のようになります。REGEXP_SUBSTRする

STREET 
------------------------- 
Hickory Str. 
One US Bank Plaza 

3番目の引数があります3つの1のうちの最初のもの。これは、アドレスの最初の文字で検索を開始することを意味します。 2番目の1は、検索パターンが最初に出現することを意味します。 nullは、特別なマッチ修飾子を持たないことを意味します(大文字と小文字を区別しません。最後の1は "マッチパターンから最初のSUBEXPRESSIONを返す"ことを意味します。部分式は、カッコで囲まれた一致式の部分です。

マッチパターンは、末尾に$を持っている - 「入力文字列の末尾にアンカー」を意味する($文字列の末尾を意味します)。次に、[...]角括弧内の文字のいずれかが一致することを意味しますが、^ [^ ...]で、それは角括弧にあるもの以外の任意の文字に一致するように変更します。 0〜9は、0〜9の間のすべての文字を意味します。だから、[^ 0-9]は任意の文字にマッチすることを意味し、その後の*は「任意の数のそのような文字」を意味する(0から入力文字列のすべてまで)。 \ s「は空白」である - アドレスで可能な数を、次のいずれかの空白がある場合、あなたは彼らが右の通りの名前の先頭に含めたくありません。部分式があるだけで、[^ 0-9] *彼らの前にスペースを含まない、非数字を意味する(\ sの*は左括弧の外側にあるため)。時々アドレスは、実際には、それに「番号」を持っていないが、その代わりに数字を使用しての単語として綴ら -

私の例では、しかし、潜在的な問題を示しています。私が示していることは、実際に私の街の現実の住所です。

幸運を祈る!

0

桁の最後の出現を探して、その後、通りの名前として進行テキストを引っ張っ

あなたは、単に行うことができます:

SELECT REGEXP_REPLACE(address, '^(.*)\d+\D*$', '\1') 
     AS street_name 
FROM address_table; 
関連する問題