【问题标题】:How to get the last index of a substring in SQLite?如何获取 SQLite 中子字符串的最后一个索引?
【发布时间】:2014-01-27 18:34:44
【问题描述】:

我在表中有一个字符串:http://www.foo.com/hello/bar/baz,我想获取最后一个 '/' 之后的所有内容(在本例中为字符串 'baz')。

我可以做 substr(str, lastIndexOf(str, '/')),但是我不知道如何在 SQLite 中获取 lastIndexOf。

【问题讨论】:

    标签: sqlite


    【解决方案1】:
    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

    【讨论】:

    • 请编辑更多信息。不鼓励使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
    • 希望补充说明对你有帮助
    • 这是一个非常聪明的答案!
    • @ungalcrys 太棒了!如果您将 '/' 更改为 '\',您可以将 Windows FullFileName 拆分为仅 FileName。如果去掉第一个replace(str, 和结尾, ''),你会得到没有文件名的路径。
    • 我希望我能多次投票!您的回答确实为我节省了很多时间。
    【解决方案2】:

    sqlite 核心函数的表达能力有限。对于已知的最大/ 字符数,这可以通过一系列嵌套的substr()instr() 调用来完成,一次将部分字符串删除到下一个/,但这不太优雅。

    你真的应该用你的编程语言来做。

    【讨论】:

      【解决方案3】:

      解决方案是将代码中出现的所有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
      

      【讨论】:

      • 你注意到sqlite标签了吗?
      • 是的。这就是为什么这是有效且经过测试的 SQLite SQL
      • @Knickerless-Noggins 除了 SQLite 没有 CHARINDEX 和 REVERSE 函数。
      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多