获取字符串 在字符的第 n 个实例之后和另一个字符的实例之前

Get string after nth instance of a character and before an instance of another character

提问人:whitchurch11 提问时间:11/18/2023 更新时间:11/18/2023 访问量:22

问:

我有一个充满网络路径的表(文档文件)。我需要从“destination”列减去文件扩展名中提取文档名称,然后将其插入到同一表中的列中。

例如,我有一个示例路径:

J:\RootFolder\Subfolder\Reference\481789.pdf

我需要提取481789并将其插入到名为“column3”的下一列中。 每条路径上的结构都是相同的,所以我正在寻找第 4 个实例之后和之前的字符串'\''.'

我相信一定有一种更优雅的方法来解决这个问题,但到目前为止,我已经尝试了以下方法,并且我已经设法修剪了扩展,并且只有第一个实例。我正在努力嵌套 CHARINDEX 以获得第 4 个实例。'\'

我还没有走得足够远,然后进行插入。

SELECT
  destination,
  SUBSTRING(destination, CHARINDEX('\', destination),
  CHARINDEX('.', destination) - CHARINDEX('\', destination)) AS substring
FROM documentfiles

SQL 子字符串 charindex

评论

0赞 nicomp 11/18/2023
使用 Python。设置它需要一段时间,但一旦配置了连接,编写代码就会容易得多。
0赞 nbk 11/18/2023
您使用的是哪种数据库系统,正则表达式可以有很大帮助
1赞 Stu 11/18/2023
标记您的 RDBMS;并且不要存储额外的列,请使用计算列。

答:

0赞 nbk 11/18/2023 #1

在 sql server 中,您可以执行以下操作

DECLARE @t varchar(100) = 'J:\RootFolder\Subfolder\Reference\481789.pdf';
SELECT
LEFT(reverse(left(reverse(@t), charindex('\', reverse(@t)) -1)),
  charindex('.',reverse(left(reverse(@t), charindex('\', reverse(@t)) -1))) - 1)
(无列名)
481789
DECLARE @t varchar(100) = 'J:\RootFolder\Subfolder\Reference\481789.pdf';
WITH ext AS (
  SELECT reverse(left(reverse(@t), charindex('\', reverse(@t)) -1)) as a)
SELECT LEFT(a,charindex('.',a)-1) FROM ext
(无列名)
481789

小提琴

评论

0赞 whitchurch11 11/18/2023
我将如何更改它,使其指向我需要信息的表?我需要为大约 380 万行执行此操作,而不仅仅是一个字符串。
0赞 nbk 11/18/2023
每个你看到一个@t用列替换它,并添加一个 FROM mytable