web-dev-qa-db-ja.com

'/'文字の後に文字列を取得します

PostgreSQL SELECTクエリで文字「/」の後の文字列を抽出したいのですが。

フィールド名はsource_path、テーブル名はmovies_history

データの例:

Source_pathの値:

  • 184738/file1.mov
  • 194839/file2.mov
  • 183940/file3.mxf
  • 118942/file4.mp4

などなど。 source_pathのすべての値はこの形式です

  • random_number/filename.xxx

「file.xxx」文字列のみを取得する必要があります。

6
Rudy Herdez

あなたのケースがそんなに単純な場合(exactlyone _/_ in the string)use split_part()

_SELECT split_part(source_path, '/', 2) ...
_

Ifmultiple_/_があり、last1つ、シンプルで高速なソリューションは、文字列を reverse() で逆方向に処理し、最初の部分を取り、reverse() 2回目:

_SELECT reverse(split_part(reverse(source_path), '/', 1)) ...
_

または正規表現を使用して、より用途の広い(そしてより高価な) substring() を使用できます。

_SELECT substring(source_path, '[^/]*$') ...
_

説明:

_[...]_ ..文字のリストを囲んで文字クラスを形成します。
_[^...]_ ..リストが_^_で始まる場合は、inversionです(リストにないすべての文字)。
_*_ .. 0-n回の数量詞。
_$_ ..文字列の末尾へのアンカー。

db <> fiddle ここ
古い sqlfiddle

25

substring 関数を使用する必要があります

SQL FIDDLE

SELECT substring('1245487/filename.mov' from '%/#"%#"%' for '#');

説明:

%/

つまり、%のテキストとその後の/

#"%#"

#は、最後の部分for '#'で定義されたプレースホルダーであり、必要と追加の"

したがって、<placeholder> % <placeholder>があり、関数は両方のプレースホルダー内で見つかったものを返します。この場合は%または/の後の残りの文字列です。

最終クエリ:

 SELECT substring(source_path from '%/#"%#"%' for '#');
 FROM movies_history
1