SQLite-文字列の一部を置き換える


103

それが使用可能であるSQLSQLite文字列の一部を置き換えるために、テーブル?

たとえば、フィールドの1つがファイルへのパスを保持するテーブルがあります。文字列の一部を置き換えることは可能ですか?

c:\afolder\afilename.bmp

なる

c:\anewfolder\afilename.bmp

回答:


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句がある場合とない場合のクエリ時間を比較しました。whereクエリがない場合、2回の時間がかかります。
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 2016年

@fifaltraはい、そうです
resedasue

絶対パスではなく相対パスのファイルシステムパスを更新する場合は、replace()を使用しないことをお勧めします。stackoverflow.com/questions/50161090/…を
NameZero912 2018年

10

そして、永続的な影響なしにクエリでそれを実行したいだけの場合:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.