在'/'字符后获取字符串

Rud*_*dez 5 regex sql postgresql pattern-matching

我想在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'字符串.

Erw*_*ter 20

如果您的情况很简单:字符串中只有一个 /,请使用split_part():

SELECT split_part(source_path, '/', 2) ...
Run Code Online (Sandbox Code Playgroud)

如果可以有多个 /,并且你想要在最后一个之后的字符串,一个简单而快速的解决方案将向后处理字符串reverse(),取第一部分,并应用reverse()第二次:

SELECT reverse(split_part(reverse(source_path), '/', 1)) ...
Run Code Online (Sandbox Code Playgroud)

或者你可以使用更通用(和更昂贵)substring()的正则表达式:

SELECT substring(source_path, '[^/]*$') ...
Run Code Online (Sandbox Code Playgroud)

说明:

[...]..包含一个字符列表以形成一个字符类.
[^...]..如果列表以^它开头是反转(所有字符都不在列表中).
*..量词为0-n次.
$..锚到字符串的结尾.

SQL小提琴演示.


Jua*_*eza 6

您需要使用子字符串函数

SQL小提琴

SELECT substring('1245487/filename.mov' from '%/#"%#"%' for '#');
Run Code Online (Sandbox Code Playgroud)

解释:

%/
Run Code Online (Sandbox Code Playgroud)

这意味着%一些文本,然后是/

#"%#"
Run Code Online (Sandbox Code Playgroud)

every#是最后一部分中定义的占位符for '#',需要和附加"

因此,您的<placeholder> % <placeholder>函数将返回两个占位符中找到的内容。在这种情况下是%或之后的字符串的其余部分/

最终查询:

 SELECT substring(source_path from '%/#"%#"%' for '#');
 FROM movies_history
Run Code Online (Sandbox Code Playgroud)