T-SQL / MS-SQL を使用して既存のテーブル セルに文字列を追加する最も簡単な方法は何ですか?
-
09-06-2019 - |
質問
「ファイル名」列を持つテーブルがあります。最近、この列に挿入を実行しましたが、慌てて入力したすべてのファイル名にファイル拡張子を追加するのを忘れてしまいました。幸いなことに、それらはすべて「.jpg」画像です。
これらの挿入フィールドの「ファイル名」列を (既知の ID 値に基づいて最近の行を選択できると仮定して) 拡張子「.jpg」を含めるように簡単に更新するにはどうすればよいですか?
解決
解決策は次のとおりです。
UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50
RTRIM が必要なのは、そうしないと [filename] 列全体が文字列連結に選択されるためです。それが varchar(20) 列で、ファイル名の長さが 10 文字のみの場合でも、その 10 文字が選択され、次に 10 個のスペースが選択されます。20 + 3 文字を 20 文字の長さのフィールドに収めようとすると、エラーが発生します。
他のヒント
MattMitchell の答えは、列が CHAR(20) の場合は正しいですが、VARCHAR(20) でスペースが明示的に入力されていない場合は正しくありません。
RTRIM 関数を使用せずに CHAR フィールドで試してみると、 "文字列型やバイナリは省略されます" エラー。
簡単で良いと思います。
update MyTable
set filename = filename + '.jpg'
where ...
編集:ああ、rtrim の提案に対する @MattMitchell の回答に +1 してください。
元のデータが (このテーブルに挿入される前に) char 列または変数から取得された場合、元のデータには varchar になる前にスペースが追加されます。
DECLARE @Name char(10), @Name2 varchar(10)
SELECT
@Name = 'Bob',
@Name2 = 'Bob'
SELECT
CASE WHEN @Name2 = @Name THEN 1 ELSE 0 END as Equal,
CASE WHEN @Name2 like @Name THEN 1 ELSE 0 END as Similiar
人生の教訓 :決して文字を使用しないでください。
David Bの「Life Lesson」を調整したかったのです。「可変長の文字列値には決してcharを使用しない」べきだと思います -> charデータ型には有効な使用方法がありますが、一部の人が考えているほど多くはありません:)
末尾のスペースの謎に対する答えは、ANSI_PADDING にあります。
詳細については、次のサイトをご覧ください。 SET ANSI_PADDING (Transact-SQL)
デフォルトは ANSI_PADDIN ON です。これは列の作成時にのみ影響しますが、既存の列には影響しません。
更新クエリを実行する前に、データを確認してください。侵害された可能性があります。
次のクエリを実行して、侵害された行を見つけます。
SELECT *
FROM tablename
WHERE LEN(RTRIM([filename])) > 46
-- The column size varchar(50) minus 4 chars
-- for the needed file extension '.jpg' is 46.
これらの行では一部の文字が失われているか、ファイル拡張子を追加するための十分なスペースがありません。