我在表中有一个字符串:http://www.foo.com/hello/bar/baz,我想得到最后一个'/'之后的所有内容(在本例中是字符串'baz')。我可以使用substr(str,lastIndexOf(str,'/')),但我不知道如何在SQLite中获取lastIndexOf。
http://www.foo.com/hello/bar/baz
csga3l581#
select replace(str, rtrim(str, replace(str, '/', '')), '') from table;
逐步解释。例如,我们有字符串:/storage/udisk/1200 Mics/[2002] 1200 Micrograms/1200 Mics - 03 - Mescaline.mp3replace(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
/storage/udisk/1200 Mics/[2002] 1200 Micrograms/1200 Mics - 03 - Mescaline.mp3
replace(str, '/', '')
/
storageudisk1200 Mics[2002] 1200 Micrograms1200 Mics - 06 - Ecstasy.mp3
noslashes
rtrim
(str, noslashes)
/storage/udisk/1200 Mics/[2002] 1200 Micrograms/
replace
1200 Mics - 03 - Mescaline.mp3
xeufq47z2#
解决方案是将代码中出现的所有FilePath和TableName替换为表中出现的名称。您需要创建一个REVERSE函数,例如:在PHP中,你可以运行以下命令:
FilePath
TableName
REVERSE
conn.create_function("REVERSE", 1, lambda s: s[::-1])
注意:每种语言都有自己创建自定义SQLite命令的方式。REVERSE的VARCHAR,然后一旦处理完成REVERSE它再次回来。
VARCHAR
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
b1uwtaje3#
sqlite核心函数的表达能力是有限的。对于已知的最大/字符数,这可以通过一系列嵌套的substr()和instr()调用来实现,每次将字符串的一部分移到下一个/,但这并不太优雅。你真的应该用你的编程语言来做。
substr()
instr()
kd3sttzy4#
ungalcrys给出的答案效果很好;
但是我有399条记录要用返回的值替换。不知道我会怎么做。我试过了;
update Part set Filename = (select replace(Part.Filename, rtrim(Part.Filename, replace(Part.Filename, '\', '')), '') from Part)
但它用一个值替换了所有记录。
4条答案
按热度按时间csga3l581#
逐步解释。例如,我们有字符串:
/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
xeufq47z2#
解决方案是将代码中出现的所有
FilePath
和TableName
替换为表中出现的名称。您需要创建一个
REVERSE
函数,例如:在PHP中,你可以运行以下命令:注意:每种语言都有自己创建自定义SQLite命令的方式。
REVERSE
的VARCHAR
,然后一旦处理完成REVERSE
它再次回来。b1uwtaje3#
sqlite核心函数的表达能力是有限的。对于已知的最大
/
字符数,这可以通过一系列嵌套的substr()
和instr()
调用来实现,每次将字符串的一部分移到下一个/
,但这并不太优雅。你真的应该用你的编程语言来做。
kd3sttzy4#
ungalcrys给出的答案效果很好;
但是我有399条记录要用返回的值替换。
不知道我会怎么做。
我试过了;
但它用一个值替换了所有记录。