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

fcipmucu  于 2023-10-23  发布在  SQLite
关注(0)|答案(4)|浏览(171)

我在表中有一个字符串:http://www.foo.com/hello/bar/baz,我想得到最后一个'/'之后的所有内容(在本例中是字符串'baz')。
我可以使用substr(str,lastIndexOf(str,'/')),但我不知道如何在SQLite中获取lastIndexOf。

csga3l58

csga3l581#

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

xeufq47z

xeufq47z2#

解决方案是将代码中出现的所有FilePathTableName替换为表中出现的名称。
您需要创建一个REVERSE函数,例如:在PHP中,你可以运行以下命令:

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

注意:每种语言都有自己创建自定义SQLite命令的方式。
REVERSEVARCHAR,然后一旦处理完成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
b1uwtaje

b1uwtaje3#

sqlite核心函数的表达能力是有限的。对于已知的最大/字符数,这可以通过一系列嵌套的substr()instr()调用来实现,每次将字符串的一部分移到下一个/,但这并不太优雅。
你真的应该用你的编程语言来做。

kd3sttzy

kd3sttzy4#

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)

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

相关问题