我想编写一个 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) 查询来从特定字符之后的列中选择字符串的一部分的主要内容,如果未能解决你的问题,请参考以下文章