我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分

Posted

技术标签:

【中文标题】我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分【英文标题】:I would like to write a sql (Oracle SQL) query to select a part of a string from a column after a specific character 【发布时间】:2018-09-27 03:19:38 【问题描述】:

例子

请看下表:

Column A                                 

J:\JAVA\CIA TEST DBMS\AdobeDocument.pdf  
J:\JAVA\CIA TEST DBMS\wordDocument.docx  

现在对于 A 列中的每个值,我想提取字符串,如

.pdf 来自第一个值 (J:\JAVA\CIA TEST DBMS\AdobeDocument.pdf)

.docx 来自第二个值 (J:\JAVA\CIA TEST DBMS\wordDocument.docx)

这里字符串的特定字符是 .从字符串的末尾开始

感谢任何帮助。

【问题讨论】:

如果字符串中没有点,查询应该返回什么?还是事先保证所有路径都以文件名(不是文件夹)结尾,并且所有文件名都有扩展名? 感谢您提出一个好问题。答案不是列中的所有值都会有 .pdf、.doc 等扩展名……在这种情况下,我们必须忽略这些值。 那么 - 为这些行返回 NULL?还是首先不包括查询输出中的行? 不包括查询输出中的行。 【参考方案1】:

使用SUBSTR + INSTR 方法

INSTR 的第三个参数 -1 向后搜索一个点,SUBSTR 在这里为您提供从该索引开始到结尾的字符。

WITH t(A)
AS
(
select 'J:\JAVA\CIA TEST DBMS\AdobeDocument.pdf' FROM DUAL UNION ALL
select 'J:\JAVA\CIA TEST DBMS\wordDocument.docx' FROM DUAL
)
select SUBSTR( A,INSTR(A ,'.',-1 )) FROM t;

Demo

【讨论】:

嗨 Kaushik...您提供的解决方案对我有用,但如果我想列出不同的值,我该怎么做?示例:如果数据库中有两个扩展名为 .pdf 的文件,那么我只想在输出中列出 .pdf 一次。 @VenkataRamanaMurthy :我不明白 “如果有两个带有 .pdf 扩展名的文件” 是什么意思。编辑您的问题并向我们展示更多示例,以涵盖所有场景和每种情况的预期结果。 来自 OP 的答案 - 如果字符串中没有点,则查询不应返回任何内容(您的解决方案将返回整个字符串;使用 WHERE 条件轻松修复,排除不存在的行t 包括一个点);他想select DISTINCT substr.......【参考方案2】:

除了 Kaushik 的建议之外,您还可以将 try regexp_substr() 函数与 '[^.]*$' 模式一起使用:

with tab(str) as
(
 select 'J:\JAVA\CIA TEST DBMS\AdobeDocument2.pdf' from dual union all
 select 'J:\JAVA\CIA TEST DBMS\AdobeDocument.pdf'  from dual union all
 select 'J:\JAVA\CIA TEST DBMS\wordDocument.docx'  from dual
)
select distinct regexp_substr(str,'\.[^.]*$') as str 
  from tab;

STR
------
.pdf
.docx

附言只需在 regexp_substr 表达式 前面使用distinct 即可获得文件类型 的不同结果。

【讨论】:

看来 OP 希望在输出中包含点。当您将其添加到正则表达式时,请记住转义点。 @mathguy 好的,刚才我已经意识到并编辑了,谢谢。 @mathguy 我不明白你说的escape the dot是什么意思 哦!在正则表达式中,. 是一个通配符——它代表任何字符。 (除了在括号中的表达式中它代表自己。)要表示一个实际的点,您必须使用反斜杠对其进行转义:\.。碰巧的是,在这种情况下,这无关紧要 - 如果您的表达式中匹配的字符不是点本身,那么它将是 [^.]* 的一部分,因此匹配将向左再扩展一个字符......直到通配符. 匹配一个实际的点。但这只是偶然。 @mathguy 非常感谢,实际上我之前也猜到了“\”作为转义字符,但正如你提到的那样,由于这种特殊情况没有出现问题,并且没有考虑使用它.再次感谢您。

以上是关于我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分的主要内容,如果未能解决你的问题,请参考以下文章

oracle执行历史查不到执行sql

JDBC概述及JDBC完成对Oracle的增删改查

从一条sql报错解决过程学习程序员查bug的思路

我想使用 dapper 在 Oracle 和 SQL 数据库上执行参数化查询

Oracle数据库速查知识文档

sql server连接oracle并实现增删改查