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

我想编写一个sql(Oracle sql)查询,从列中选择特定字符后的字符串部分,sql,oracle,Sql,Oracle,我想编写一个sql(Oracle sql)查询,从列中选择特定字符后的字符串部分 范例 请参阅下表: Column A J:\JAVA\CIA TEST DBMS\AdobeDocument.pdf J:\JAVA\CIA TEST DBMS\wordDocument.docx 现在,对于A列中的每个值,我想提取如下字符串 .pdf来自第一个值(J:\JAVA\CIA TEST DBMS\AdobeDocument.p

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

范例

请参阅下表:

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

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

这里字符串的特定字符是。从绳子的末端


感谢您的帮助。

使用
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;

使用
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;

除了Kaushik的建议之外,您还可以使用
'[^.]*$'模式使用
regexp\u 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

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

除了Kaushik的建议之外,您还可以使用
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


p、 只需在regexp\u substr表达式前面使用
distinct
,即可获得文件类型的不同结果。

如果字符串中没有点,查询应返回什么?或者事先保证所有路径都以文件名(而不是文件夹)结尾,并且所有文件名都有扩展名吗?谢谢你提出了一个好问题。答案是不是列中的所有值都有扩展名,如.pdf、.doc等…在这种情况下,我们必须忽略这些值。那么-为这些行返回NULL?或者首先不包括查询输出中的行?不包括查询输出中的行。如果字符串中没有点,查询应该返回什么?或者事先保证所有路径都以文件名(而不是文件夹)结尾,并且所有文件名都有扩展名吗?谢谢你提出了一个好问题。答案是不是列中的所有值都有扩展名,如.pdf、.doc等…在这种情况下,我们必须忽略这些值。那么-为这些行返回NULL?或者首先不在查询的输出中包含行?不在查询的输出中包含行。OP似乎希望在输出中包含点。当您将其添加到regexp时,请记住转义点。@mathguy好的,刚才我已经意识到并编辑了,谢谢。@mathguy我不明白您所说的转义点是什么意思!在正则表达式中,
是一个通配符-它代表任何字符。(括号内的表达式表示自身除外)要表示实际点,必须用反斜杠转义:
\。
。碰巧,在这种情况下,这无关紧要-如果表达式中匹配的字符不是点本身,那么它将是
[^.]*
的一部分,因此匹配将向左扩展一个字符。。。直到通配符
与实际点匹配为止。但这只是偶然的。“Mathayy非常感谢你,事实上,我也猜到”作为逃逸角色之前,但你没有提到这个问题的原因,并没有考虑使用它。再次感谢。OP似乎想在输出中包含点。当您将其添加到regexp时,请记住转义点。@mathguy好的,刚才我已经意识到并编辑了,谢谢。@mathguy我不明白您所说的转义点是什么意思!在正则表达式中,
是一个通配符-它代表任何字符。(括号内的表达式表示自身除外)要表示实际点,必须用反斜杠转义:
\。
。碰巧,在这种情况下,这无关紧要-如果表达式中匹配的字符不是点本身,那么它将是
[^.]*
的一部分,因此匹配将向左扩展一个字符。。。直到通配符
与实际点匹配为止。但这只是偶然的。“Mathayy非常感谢你,事实上,我也猜到”作为逃逸角色之前,但你没有提到这个问题的原因,并没有考虑使用它。再次感谢你,嗨,考希克。。。你给出的解决方案对我很有效,但如果我想列出不同的值,我该怎么做??示例:在DB中,如果有两个扩展名为.pdf的文件,那么我只想在输出中列出一次.pdf。@VenkataRamanaMurthy:我不明白“如果有两个扩展名为.pdf的文件”是什么意思。编辑您的问题并向我们展示更多示例,以涵盖所有场景和每个案例的预期结果。从OP的答案来看,如果字符串中没有点,则查询不应返回任何内容(您的解决方案将返回整个字符串;使用WHERE条件很容易修复,以排除不包含点的行);他想
选择不同的子项……
Hi Kaushik。。。你给出的解决方案对我很有效,但如果我想列出不同的值,我该怎么做??示例:在DB中,如果有两个扩展名为.pdf的文件,那么我只想在输出中列出一次.pdf。@VenkataRamanaMurthy:我不明白“如果有两个扩展名为.pdf的文件”是什么意思。编辑您的问题,并向我们展示更多示例,以涵盖所有场景和每个案例的预期结果。从OP的答案来看,如果字符串中没有点,则查询不应返回任何内容(您的解决方案将返回ENTR