2015-09-03 130 views
4

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

+0

这听起来像是使用正则表达式的原因!你是在处理数据后得到它,还是只想从数据库返回filename.mov?在获取数据后,做这种事情更容易,但我认为仍然可以在SQL中完成。 – WOUNDEDStevenJones

+0

我会在得到它之后处理数据。 –

+0

返回时如何处理它? PHP?如果是这样,你可以使用http://php.net/manual/en/function.strrpos.php的组合来找到最后的'/',然后http://php.net/manual/en/function.substr .php获取文件名。 – WOUNDEDStevenJones

回答

8

如果你的情况就是这么简单:只有一个字符串中/,使用split_part()

SELECT split_part(source_path, '/', 2) ... 

如果可以有多个/,并且希望最后一个字符串后,一个简单而快速的解决方案将与reverse()向后处理字符串,采取的第一个部分,并应用reverse()第2个时间:

SELECT reverse(split_part(reverse(source_path), '/', 1)) ... 

或者您可以使用更多功能(更昂贵)substring()用正则表达式:

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

说明:

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

SQL Fiddle demo.

+0

是否可以将返回的子串值存储到变量中?对不起,作为一个完整的noob,但我正在学习SQL,并想了解更多。 –

+0

取决于上下文和用例。这可能有所帮助:http://stackoverflow.com/a/14261927/939860。否则,请问一个新的*问题*,评论不是这个地方。 –

+1

嗨Erwin。我只是回到这里,因为有一个upvote。你的第一个解决方案非常棒,因为我认为OP的需求只有一个'/'。但是当我用多个'/'尝试第二个解决方案时,在第一个'/'之后返回所有内容......而不是在**最后一个之后的文本**'/'不确定这是否意图。你可以在这里查看差异。 http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/9525 –

1

您需要使用substring功能

SQL FIDDLE

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

说明:

%/ 

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

#"%#" 

每个#是在最后一部分for '#'定义的占位符,它需要和aditional的"

所以,你必须<placeholder> % <placeholder>和函数会返回什么都占位发现里面。在这种情况下是%或串的后/

最终查询的其余部分:

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

没问题,我包含最终查询。我不想粗鲁,但如果你无法弄清楚最后一步,你可能首先需要一个初学者的SQL课程。 –

+0

谢谢我发布后得到它。 –