Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取“/”字符后的字符串_Sql_Regex_Postgresql_Pattern Matching - Fatal编程技术网

Sql 获取“/”字符后的字符串

Sql 获取“/”字符后的字符串,sql,regex,postgresql,pattern-matching,Sql,Regex,Postgresql,Pattern Matching,我想在PostgreSQL SELECT查询中提取字符“/”后面的字符串 字段名为source\u path,表名为movies\u history 数据示例: 源路径的值: 184738/file1.mov 194839/file2.mov 183940/file3.mxf 118942/file4.mp4 等等。源路径的所有值均采用此格式 随机编号/filename.xxx 我只需要获取'file.xxx'字符串。您需要使用函数 说明: %/ 这意味着%的文本和/ 每个都是最后一部分中定义

我想在PostgreSQL SELECT查询中提取字符“/”后面的字符串

字段名为source\u path,表名为movies\u history

数据示例:

源路径的值:

184738/file1.mov 194839/file2.mov 183940/file3.mxf 118942/file4.mp4 等等。源路径的所有值均采用此格式

随机编号/filename.xxx 我只需要获取'file.xxx'字符串。

您需要使用函数

说明:

%/
这意味着%的文本和/

每个都是最后一部分中定义的占位符,用于和需要以及传统

所以您有%和函数将返回在这两个占位符中找到的内容。在本例中是%或后面字符串的其余部分/

最后查询:


如果您的案例如此简单,请在字符串中使用/

如果可以有多个/,并且您希望字符串位于最后一个之后,一个简单而快速的解决方案是使用向后处理字符串,取第一部分,然后第二次反转:

SELECT reverse(split_part(reverse(source_path), '/', 1)) ...
或者您可以使用更通用、更昂贵的正则表达式:

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

%/
[…]。。包含字符列表以形成字符类。 [^...] .. 如果列表以“^”开头,则列表中所有不在列表中的字符都将反转。 * .. 0-n次的量词。 $ .. 锚定在绳子的末端

小提琴
Old

这听起来像是使用正则表达式的理由!您是在获取数据后处理数据,还是只希望从数据库返回filename.mov?在获取数据后,这样做更容易,但我认为仍然可以在SQL中执行。获取数据后,我将处理数据。当数据返回时,您将如何处理它?PHP?如果是这样,您可以使用的组合来查找最后一个“/”,然后仅获取文件名。一个示例很难充分描述字符串的外观。要得到一个有用的查询,您需要更加具体。@Erwin,我添加了更多的示例,以防其他人有类似的问题。谢谢没问题,我包含了最后一个查询。我不想太粗鲁,但是如果你不能理解最后一步,你可能需要先学习sql初学者课程。谢谢,我在发布后得到了它。是否可以将返回的子字符串值存储到变量中?很抱歉,我是一个彻头彻尾的noob,但我正在学习SQL,希望了解更多。这取决于上下文和用例。这可能有帮助:。否则,请问一个新问题,评论不是地方。嗨,欧文。我回来是因为我得到了一票。您的第一个解决方案很好,因为我认为只有一个/on-OP需求。但是当我尝试第二个解决方案时,在第一个解决方案之后使用multiple/返回所有内容/。。。而不是最后一个后面的文本/不确定这是否是目的。您可以在这里检查差异@JuanCarlosOropeza:谢谢你指出。上一个第二个解决方案不适用于字符串中的多个/。我用一个实际可行的解决方案取代了它。更新小提琴:
SELECT split_part(source_path, '/', 2) ...
SELECT reverse(split_part(reverse(source_path), '/', 1)) ...
SELECT substring(source_path, '[^/]*$') ...