【问题标题】:Oracle INSTR backward in Oracle SQL Developer does not work.Oracle SQL Developer 中向后的 Oracle INSTR 不起作用。
【发布时间】:2014-11-25 19:46:48
【问题描述】:

我试图在 Oracle SQL Developer 中使用 regexp_substr 和 instr 从我的数据库中获取一个值,然后从右到左到第一个“/”,然后使用右边的值。

table name: access_log
col name: download
value: Download file:/webdocs/data/groupXXX/case/03_28_54_9_0000011856.pdf

我试图只得到价值的 03_28_54_9_0000011856.pdf 部分。我有以下 SQL:

select regexp_substr(download, '(.*)/', instr(download,'/',1,4)+1,1,'i',1) 
from access_log;

但我在 SQL Developer 中收到以下错误:

ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

谁能告诉我为什么我会收到这个错误以及我如何才能做到这一点

【问题讨论】:

  • download 列的类型是什么?
  • 在您的实际用例中有什么东西可以强制REGEXP_INTSTRINSTR 结合使用吗?
  • 更简单的方法:regexp_replace(download, '.*/', '')
  • Wumpus Q. Wumbley 请发表你的答案,我给你信用
  • @WumpusQ.Wumbley 将其发布为答案。

标签: regex oracle substring oracle-sqldeveloper


【解决方案1】:

instrregexp_substr 的组合看起来相当复杂。你想要最后一个斜线之后的所有内容吗?找到更简单答案的关键是一种通常对正则表达式有帮助的技术:如果问题看起来很难,则将其反转。与其想着想保留什么,不如想着想摆脱什么。

在这种情况下,您希望删除直到最后一个斜杠(包括最后一个斜杠)的所有内容,这是一个非常简单的正则表达式:.*/

所以只需匹配它并用空字符串替换它。

regexp_replace(download, '.*/', '')

【讨论】:

  • 等等...这是不对的...我需要从右边的第二个“/”到右边的第一个“1”...我必须以“案例”
  • 虽然您的原始查询确实为我返回了“case”(并且没有失败)(当我复制示例字符串并针对 DUAL 运行时),但您确实明确要求“03_28_54_9_0000011856.pdf” - Wumpus Q. Wumbley 提供...
【解决方案2】:

随着目标帖子的移动:
SELECT REGEXP_REPLACE('file:/webdocs/data/groupXXX/case/03_28_54_9_0000011856.pdf', '^.*/(.*)/.*$', '\1') FROM DUAL;

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2018-01-09
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多