2015-09-03 168 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

謝謝我發佈後得到它。 –