Rud*_*dez 5 regex sql postgresql pattern-matching
我想在PostgreSQL SELECT查询中的字符'/'后提取字符串.
字段名称是source_path,表名是movies_history.
数据示例:
source_path的值:
等等.source_path的所有值都采用此格式
我只需要获取'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次.
$..锚到字符串的结尾.
您需要使用子字符串函数
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)