SQLite-替换字符串的一部分


103

是否可以SQLSQLite表中使用它来替换字符串的一部分?

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

c:\afolder\afilename.bmp

变成

c:\anewfolder\afilename.bmp

Answers:


206

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

SQLite核心函数列表中详细介绍了其他字符串操作函数(以及更多)

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

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


6
虽然WHERE子句不是必需的,但确实可以让您省心。没有WHERE,SqlLite会告诉您表中的每一行都受到影响。通过使用WHERE,您只会得到预期的十几行,而不是数千行。
韦斯顿婚礼

2
@WestonWedding我比较了有和没有WHERE子句的查询时间。没有查询将花费两倍的时间。
Parag Bafna

仅供参考,这和vladkras的解决方案区分大小写。我尝试插入LIKE语句以使其不区分大小写,但是我无法使其正常工作,我认为使用SQLite Replace命令是不可能的。
ShadowLiberal

谢谢。Darktable使用sqlite db存储图像的位置,因此为我节省了大约9000次更改!
菲尔(Phil)

29

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

  1. C:\afolder无论如何,只有包含的字段会受到影响,没有理由对其进行检查。太过分了
  2. 'C:\afolder\%'将只选择以开头的字段C:\afolder\。如果您在字符串中包含此路径怎么办?

因此正确的查询是:

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

这将替换“字段”列中每个字符串中的字符串吗?
fifaltra

@fifaltra是的
resedasue 2016年

请注意,如果要更新文件系统路径是相对的(而不是绝对的),我不建议使用replace()。见stackoverflow.com/questions/50161090/...
NameZero912

10

而且,如果您只想在查询中执行此操作而没有持久的后果,则:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.