2017-05-24 3 views
1

私はOracleとJDBCを使ってムービーのリストを持つデータベースを設定しています。ロードされるフィールドは、MovieId、MovieTitle、およびGenreです。 フォーマット例:Oracle SQLの正規表現とカラム分割

MovieId  MovieTitle    Genre 
1   Toy Story (1997)  Animated 

今私は、「イヤー」と呼ばれる別の列に1997年のリストを表示するために私MovieTitleを分割する必要があります。私の映画のいくつかは、そのタイトルに括弧を持っているので、それは、何も良いですが

SELECT SUBSTR(Movies.MovieTitle, 1, INSTR(Movies.MovieTitle, '(')-1) AS MovieTitle, 
    SUBSTR(Movies.MovieTitle, INSTR(Movies.MovieTitle, ')')) AS Year 
FROM MOVIES; 

:私はそれがこれを使用して、以前の動作するようになりました。だから、私は正規表現を使用する必要があると思うが、私はそれを動作させることはできません。ここで私が周りを遊んでいるものは次のとおりです。

WITH TEST AS 
(SELECT MovieTitle FROM Movies) 
SELECT REGEXP_SUBSTR(Movies.MovieTitle, '^\(\d{4}\)$', 1, 1) MovieTitle, 
    REGEXP_SUBSTR(Movies.MovieTitle, '^\(\d{4}\)$', 1, 2) Year 
FROM Movies; 

すべての私に私のすべての映画の2つのnull列です。私は正しい道を歩いていますか?もう一つの懸念は、私がオリジナルのMoviesテーブルの更新であり、新しいクエリや独自のテーブルではないことです。ご意見ありがとうございます。

答えて

1

^はストリングアンカーの開始点(ストリング位置の始まりと一致)で、$がストリング位置の終わりと一致することに注意してください。 ^\(\d{4}\)$は、(1234)のような文字列と一致します。開始位置や一致数は、文字列全体がパターンと一致する必要があるため、設定する必要はありません。

あなたはそれが()で囲まれた最初の4桁のシーケンスを抽出します

REGEXP_SUBSTR(Movies.MovieTitle, '\((\d{4})\)', 1, 1, NULL, 1) 

を使用することができます。

詳細

  • \( - リテラル(
  • (\d{4}) - (REGEXP_SUBSTRに最後1引数と呼ばれる)グループ1捕捉正確4つの連続数字
  • \)
  • - リテラル)

online demoを参照してください。

+0

素晴らしい!これは間違いなく数字の抽出に役立ちますが、私のムービーテーブルにはどのように別の列がありますか? – Polyphase29

+1

@ Polyphase29:それはすでに正規表現に関連していないものです。私はあなたがすでにその列を持っている必要があると思うと、抽出された値を挿入するだけです。 –

+0

SQL Developerでデータベースを実行するとSQLが動作するようになりますが、Javaコードを使用して実行しようとしていて、Javaのエスケープシーケンスを実行したいと思って混乱させてしまいます。 。いくつかの検索を通じて私は正規表現を '\\\\((\ \\\ d {4})\\\\'に変更すると思っていましたが、そのたびにnullになります。私はそれを動作させるために更新することができます上の任意のアイデア? – Polyphase29