如何在SQLite中获取子字符串的最后一个索引?
我在表中有一个字符串:如何在SQLite中获取子字符串的最后一个索引?,sqlite,Sqlite,我在表中有一个字符串:http://www.foo.com/hello/bar/baz我想得到最后一个“/”后面的所有内容(在本例中是字符串“baz”) 我可以做substr(str,lastIndexOf(str,“/”),但我不知道如何在SQLite中获得lastIndexOf。SQLite核心函数的表达能力是有限的。对于已知最大数量的/字符,这可以通过一系列嵌套的substr()和instr()调用来完成,一次将字符串的一部分删除到下一个/,但这并不太优雅 你真的应该用你的编程语言来做 s
http://www.foo.com/hello/bar/baz
我想得到最后一个“/”后面的所有内容(在本例中是字符串“baz”)
我可以做substr(str,lastIndexOf(str,“/”),但我不知道如何在SQLite中获得lastIndexOf。SQLite核心函数的表达能力是有限的。对于已知最大数量的
/
字符,这可以通过一系列嵌套的substr()
和instr()
调用来完成,一次将字符串的一部分删除到下一个/
,但这并不太优雅
你真的应该用你的编程语言来做
select replace(str, rtrim(str, replace(str, '/', '')), '') from table;
逐步解释。例如,我们有以下字符串:
/storage/udisk/1200 Mics/[2002]1200微克/1200 Mics-03-Mescaline.mp3
replace(str,“/”,“)
从str中删除/
字符,因此我们将有:
storageudisk1200话筒[2002]1200微克1200话筒-06-摇头丸.mp3
让我们称之为noslashesnoslashes
。接下来我们使用(str,noslashes)
,它将从右侧开始删除出现在noslashes
中的所有字符。由于noslashes
包含字符串中除/
以外的所有内容,因此将从右侧进行修剪,直到找到/
字符。这样我们就找到了我们的父目录:
/storage/udisk/1200麦克风/[2002]1200微克/
现在,我们使用replace
从文件路径中删除父路径名,我们只有文件名
1200麦克风-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
请编辑更多信息。不鼓励只编写代码和“试试这个”答案,因为它们不包含可搜索的内容,也不解释为什么有人应该“试试这个”。我们努力成为知识的来源。我希望补充的解释能帮助你。这是一个非常聪明的答案@真是太棒了!如果将
'/'
更改为'\'
,则可以仅将Windows FullFileName拆分为文件名。如果切掉第一个替换(str,
和结尾,“”)
你得到的路径没有文件名。我希望我能多次投票!你的回答真的节省了我很多时间。你注意到sqlite标签了吗?是的。这就是为什么这是有效且经过测试的SQLiteSQL@Knickerless-除了SQLite之外,Noggins没有CHARINDEX或REVERSE函数。