我的表中有一个字符串:
http://www.foo.com/hello/bar/baz
,我想获取最后一个“/”之后的所有内容(在本例中为字符串“baz”)。
我可以做 substr(str, lastIndexOf(str, '/')),但我不知道如何在 SQLite 中获取lastIndexOf。
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
解决方案是将代码中出现的所有
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
sqlite核心函数的表达能力是有限的。对于已知最大数量的
/
字符,这可以通过一系列嵌套 substr()
和 instr()
调用来完成,一次将字符串的一部分删除到下一个 /
,但这不太优雅。
你真的应该用你的编程语言来做。
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)
但它用单个值替换了所有记录。