【问题标题】:SQLite - replace part of a stringSQLite - 替换字符串的一部分
【发布时间】:2012-05-18 22:42:33
【问题描述】:

是否可以在SQLite 表中使用SQL 来替换部分字符串?

例如,我有一个表格,其中一个字段包含文件的路径。 是否可以替换部分字符串,例如

c:\afolder\afilename.bmp

变成

c:\anewfolder\afilename.bmp

?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    如果您只想在查询中执行此操作而不会产生持久后果:

    SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
    

    【讨论】:

      【解决方案2】:

      @Andrew 答案部分正确。此处无需使用WHERE 子句:

      1. 只有包含C:\afolder 的字段才会受到影响,没有理由去检查它。太过分了。
      2. 'C:\afolder\%' 将仅选择以 C:\afolder\ 开头的字段。如果你在字符串中有这个路径怎么办?

      所以正确的查询就是:

      UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');
      

      【讨论】:

      • 这会替换“字段”列中每个字符串中的字符串吗?
      • @fifaltra 会的
      • 请注意,当您想要更新文件系统路径时,如果它们是相对的(而不是绝对的),我不建议使用 replace()。见stackoverflow.com/questions/50161090/…
      【解决方案3】:

      您可以使用内置的replace() 函数在查询中执行字符串替换。

      其他字符串操作函数(以及更多)在SQLite core functions list中有详细说明

      以下内容应为您指明正确的方向。

      UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\' ) WHERE field LIKE 'C:\afolder\%';

      【讨论】:

      • 虽然 WHERE 子句不是必需的,但它确实让人安心。如果没有 WHERE,SqlLite 会告诉您表中的每一行都受到了影响。通过使用 WHERE,您只会得到预期的十几行而不是数千行。
      • @WestonWedding 我比较了有无 WHERE 子句的查询时间。如果没有 where 查询需要两次时间。
      • 仅供参考,这和 vladkras 的解决方案区分大小写。我尝试插入 LIKE 语句以使其不区分大小写,但我无法让它工作,我认为 SQLite Replace 命令不可能。
      • 谢谢。 Darktable 使用 sqlite db 来存储图像的位置,所以这为我节省了大约 9000 次更改!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      相关资源
      最近更新 更多