【发布时间】:2014-01-27 18:34:44
【问题描述】:
我在表中有一个字符串:http://www.foo.com/hello/bar/baz,我想获取最后一个 '/' 之后的所有内容(在本例中为字符串 'baz')。
我可以做 substr(str, lastIndexOf(str, '/')),但是我不知道如何在 SQLite 中获取 lastIndexOf。
【问题讨论】:
标签: sqlite
我在表中有一个字符串:http://www.foo.com/hello/bar/baz,我想获取最后一个 '/' 之后的所有内容(在本例中为字符串 'baz')。
我可以做 substr(str, lastIndexOf(str, '/')),但是我不知道如何在 SQLite 中获取 lastIndexOf。
【问题讨论】:
标签: sqlite
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
【讨论】:
'/' 更改为 '\',您可以将 Windows FullFileName 拆分为仅 FileName。如果去掉第一个replace(str, 和结尾, ''),你会得到没有文件名的路径。
sqlite 核心函数的表达能力有限。对于已知的最大/ 字符数,这可以通过一系列嵌套的substr() 和instr() 调用来完成,一次将部分字符串删除到下一个/,但这不太优雅。
你真的应该用你的编程语言来做。
【讨论】:
解决方案是将代码中出现的所有FilePath 和TableName 替换为它们在表中出现的名称。
您需要创建一个 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
【讨论】: