如何在SQLite中获取子字符串的最后一个索引?

问题描述 投票:0回答:4

我的表中有一个字符串:

http://www.foo.com/hello/bar/baz
,我想获取最后一个“/”之后的所有内容(在本例中为字符串“baz”)。

我可以做 substr(str, lastIndexOf(str, '/')),但我不知道如何在 SQLite 中获取lastIndexOf。

sqlite
4个回答
82
投票
select replace(str, rtrim(str, replace(str, '/', '')), '') from table;

逐步解释。例如,我们有字符串:

/storage/udisk/1200 Mics/[2002] 1200 Micrograms/1200 Mics - 03 - Mescaline.mp3

replace(str, '/', '')
从 str 中删除
/
字符,因此我们将得到:

storageudisk1200 Mics[2002] 1200 Micrograms1200 Mics - 06 - Ecstasy.mp3

我们称之为

noslashes
。接下来我们使用
rtrim
(str, noslashes)
,它将从右侧开始删除
noslashes
中出现的所有字符。因为
noslashes
包含字符串中除
/
之外的所有内容,因此将从右侧修剪,直到找到
/
字符。这样我们就找到了我们的父目录:

/storage/udisk/1200 Mics/[2002] 1200 Micrograms/

现在我们使用

replace
从文件路径中删除父路径名,我们只有文件名

1200 Mics - 03 - Mescaline.mp3


1
投票

解决方案是将代码中出现的所有

FilePath
TableName
替换为表格中出现的名称。

您需要创建一个

REVERSE
函数,例如在 PHP 中,您将运行以下命令:

conn.create_function("REVERSE", 1, lambda s: s[::-1])

注意:每种语言都有自己的创建自定义 SQLite 命令的方法。

REVERSE
VARCHAR
,然后处理完成后
REVERSE
再次返回。

SELECT 
    FilePath, 
    REVERSE(SUBSTR(REVERSE(FilePath), INSTR(REVERSE(FilePath), '\'), LENGTH(FilePath))) AS [DirectoryPath], 
    REVERSE(SUBSTR(REVERSE(FilePath), 0, INSTR(REVERSE(FilePath), '\'))) AS [Filename] 
FROM 
    TableName

0
投票

sqlite核心函数的表达能力是有限的。对于已知最大数量的

/
字符,这可以通过一系列嵌套
substr()
instr()
调用来完成,一次将字符串的一部分删除到下一个
/
,但这不太优雅。

你真的应该用你的编程语言来做。


0
投票

ungalcrys给出的答案效果很好;

select replace(str, rtrim(str, replace(str, '/', '')), '') from table;

但是我有 399 条记录想要用返回的值替换。

不知道该怎么做。

我试过了;

update Part set Filename = (select replace(Part.Filename, rtrim(Part.Filename, replace(Part.Filename, '\', '')), '') from Part)

但它用单个值替换了所有记录。

© www.soinside.com 2019 - 2024. All rights reserved.