【问题标题】:Get string after '/' character获取'/'字符后的字符串
【发布时间】:2015-09-03 17:20:29
【问题描述】:

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

【问题讨论】:

  • 这听起来像是使用正则表达式的理由!您是在获取数据后完全处理数据,还是只想从数据库返回 filename.mov?取回数据后做这种事情会更容易,但我认为在 SQL 中仍然可以做到。
  • 拿到数据后我会处理。
  • 退货后如何处理? php?如果是这样,您可以使用php.net/manual/en/function.strrpos.php 的组合来查找最后一个“/”,然后使用php.net/manual/en/function.substr.php 来获取文件名。
  • one 示例很难充分描述字符串的外观。您需要更加具体才能获得有用的查询。
  • @ Erwin,我添加了更多示例以防其他人有类似问题。谢谢!

标签: sql regex postgresql pattern-matching


【解决方案1】:

如果您的情况如此简单(完全字符串中有一个/),请使用split_part()

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

如果可以有多个/,并且您想要最后一个之后的字符串,一个简单快速的解决方案是用reverse() 向后处理字符串,取第一部分,然后再次reverse()

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

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

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

解释:

[...] .. 包含一个字符列表以形成一个字符类。
[^...] .. 如果列表以 ^ 开头,则它是 inversion(所有字符不在列表)。
* .. 0-n 次的量词。
$ .. 锚定到字符串末尾。

db小提琴here
sqlfiddle

【讨论】:

  • 是否可以将返回的子字符串值存储到变量中?对不起,我是一个完整的菜鸟,但我正在学习 SQL 并想了解更多。
  • 取决于上下文和用例。这可能会有所帮助:stackoverflow.com/a/14261927/939860。否则,请提出一个新的问题,cmets 不是这个地方。
  • 嗨欧文。我只是回到这里,因为得到了一张赞成票。您的第一个解决方案很棒,因为我认为只有一个 / 满足 OP 要求。但是,当我尝试使用多个 / 的第二个解决方案时,返回第一个 / 之后的所有内容...而不是 last one / 之后的文本,不确定这是否是意图。您可以在此处检查差异。 sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/9525
  • @JuanCarlosOropeza:感谢您的指出。先前的第二个解决方案不适用于字符串中的多个/。我用一个真正有效的解决方案替换了它。更新小提琴:sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/9577
【解决方案2】:

你需要使用substring函数

SQL FIDDLE

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

解释:

%/

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

#"%#"

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

所以你有<placeholder> % <placeholder> 并且函数将返回在两个占位符中找到的内容。在这种情况下是%/ 之后的其余字符串

最终查询:

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

【讨论】:

  • 没问题,我包含了最终查询。而且我不想粗鲁,但是如果您无法弄清楚最后一步,您可能需要先上一门初级 sql 课程。
  • 谢谢我发帖后收到了。
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多