SQLite - 替换字符串的一部分

122

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

例如,假设我有一个表格,其中一个字段保存了文件的路径。 是否可能替换字符串的某些部分,例如:

c:\afolder\afilename.bmp

变成

c:\anewfolder\afilename.bmp
3个回答

238

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

其他的字符串操作函数(和更多)在SQLite核心函数列表中有详细说明。

以下内容应指引您正确方向。

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


9
虽然WHERE子句不是必需的,但它确实能带来一点心安。如果没有WHERE,SqlLite会告诉你表中的每一行都受到了影响。通过使用WHERE,你只会得到你预期中的几行结果,而不是可能有数千行的结果。 - Weston Wedding
5
我已经比较了带有和不带有 WHERE 子句的查询时间。没有 WHERE 子句时,查询时间是带有 WHERE 子句时的两倍。 - Parag Bafna
顺便提一下,这个和vladkras的解决方案是区分大小写的。我尝试插入LIKE语句使其不区分大小写,但我无法让它工作,我认为在SQLite Replace命令中不可能实现。 - ShadowLiberal
谢谢。Darktable使用sqlite数据库来存储图像的位置,因此这为我节省了约9000次更改! - Phil

33

@Andrew 的回答部分正确。这里没有必要使用 WHERE 子句:

  1. 只有包含 C:\afolder 的字段才会受到影响,没有必要检查它。这是过度的。
  2. 'C:\afolder\%' 只会选择以 C:\afolder\ 开头的字段。如果您的字符串中包含此路径怎么办?

因此,正确的查询只需:

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

这会将每个字段中的字符串都替换掉吗? - fifaltra
@fifaltra 是的,它会。 - resedasue
1
请注意,如果要更新文件系统路径(而不是绝对路径),我不建议使用replace()。请参见https://stackoverflow.com/questions/50161090/replace-path-string-in-sqlite-db-causes-unexpected-violated-unique-constraint - MShekow

10

如果你只想在查询中执行它,而不带来持久的后果:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接