Oracle SQL - 名前の文字列を解析し、最初の初期&最後の名前に変換します

StackOverflow https://stackoverflow.com/questions/371490

  •  21-08-2019
  •  | 
  •  

質問

誰もがこの文字列をオンにする方法を知っている:「スミス、ジョン・R」
"JSMITH"

:?この文字列に

私は)(下ですべてを小文字に必要
カンマがどこにあるか見つけて、それが整数の場所値のTRACK
そのコンマの後の最初の文字を取得し、文字列の前にそれを置く
そして、全体の姓を取得し、最初のイニシャルの後にそれを貼り付けます。

追記 - INSTR()関数は、私のバージョンと互換性がありません

任意の助けてくれてありがとう!

役に立ちましたか?

解決

あなた自身のINSTR関数を書き込むことによって開始 - 例えばmy_instrそれを呼び出します。それが見つかるまで、それはを、「CHAR 1とループから開始されます。

あなたはINSTRと同じように

次に使用します。

他のヒント

Oracleの正規表現を使用している、これを行うための最善の方法は、このように、備えています

SELECT LOWER(regexp_replace('Smith, John R', 
             '(.+)(, )([A-Z])(.+)', 
             '\3\1', 1, 1)) 
  FROM DUAL;

と言う、あなたは残りの文字が続く大文字、続く続く任意の文字セット、「」、のパターンを見つけるとき1)、第三の要素(最初の名前のイニシャルを)取ると追加苗字。そして、すべての小文字を行います。

あなたのサイドノート:「INSTR()関数の私のバージョンと互換性がありません」という機能が年齢の周りされていますように、私には意味がありません。正規表現は、唯一のバージョン9iのでOracleに追加されたため、バージョンを確認します。

のポイントをお寄せいただきありがとうございます。

- シチュー

INSTR()は何のバージョンと互換性がありませんか? Oracleの?あなたは、バージョン4か何かを使用していますか?

独自の関数を作成する必要はありません、と率直に言って、これは既に存在しているSQL関数でかなり簡単に行うことができ、時間の無駄と思われます。ケアは、ずさんなデータ入力を説明するために注意する必要があります。

ここでは、あなたの定められた目標を達成するための別の方法があります:

with name_list as
  (select '   Parisi, Kenneth R' name from dual)
select name
      -- There may be a space after the comma.  This will strip an arbitrary
      -- amount of whitespace from the first name, so we can easily extract
      -- the first initial.
     , substr(trim(substr(name, instr(name, ',') + 1)), 1, 1) AS first_init
      -- a simple substring function, from the first character until the
      -- last character before the comma.
     , substr(trim(name), 1, instr(trim(name), ',') - 1) AS last_name
      -- put together what we have done above to create the output field      
     , lower(substr(trim(substr(name, instr(name, ',') + 1)), 1, 1)) ||
       lower(substr(trim(name), 1, instr(trim(name), ',') - 1)) AS init_plus_last
  from name_list;  

HTH、 ゲイブ

私はつらい時はあなたが適切なINSTR(へのアクセス権を持っている)が、その場合は、独自のバージョンを実装していないと信じています。

あなたがまっすぐにすることを持っていると仮定します:

select 
  substr( 
      lower( 'Smith, John R' )
    , instr( 'Smith, John R', ',' ) + 2
    , 1 
  ) || -- first_initial
  substr( 
      lower( 'Smith, John R' )
    , 1
    , instr( 'Smith, John R', ',' ) - 1 
  ) -- last_name
from dual;

また、すべての名前は、その形式になりますあなたの仮定に注意してください。カンマの後に半角スペース以外の何か、「パリージ・ジュニア」などのようなデータを持つ最後の名前に気をつけます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top