読者です 読者をやめる 読者になる 読者になる

Web・IT うんたらら

業務系とWeb系の狭間でIT業界を彷徨いながら備忘録と足跡を残していきます

【SQL】全項目(カラム)に対して置換などの処理を行いたい

全てのカラムに対して同じ条件で文字列の一括置換を行いたい場合ありますよね?
UPDATEコマンドは、たとえSETする値が同じでも、一つ一つのカラムに対して値を記述しなくてはいけません。面倒なのでシェルスクリプトで自動化しましょう。

以下は、全カラムのhogeをfugaに置換する例です。
DB名、およびテーブル名の部分は適当に読み替えてください。
PostgreSQL + bashでテストしていますが、おそらくMySQLなどでも動作するかと。

#!/bin/sh
psql -t -c "SELECT column_name FROM information_schema.columns WHERE table_catalog='DB' AND table_name='テーブル名' AND (data_type='character' OR data_type='character varying') order by ordinal_position" DB名 | while read col_name
do
    if [[ -z "${col_name}" ]] ; then //最後の空行を読み飛ばす
        continue
    fi
    echo "--${col_name}--"
    psql -c "UPDATE テーブル名 SET ${col_name} = REPLACE(${col_name} ,'hoge', 'fuga') WHERE ${col_name} LIKE '%hoge%'" DB名
done

解説

1. カラム名を、information_schemaのcolumnsテーブルから引っ張ってきます。
ここでは、抽出条件として、data_typeに文字列であることを指定しています。実施する処理に応じて変更してみてください。

2. 手順1で取得したカラム名を whileに渡します。

3. カラムを変数col_nameに受け取っているので、それを基にクエリを流します。
今回は、どのカラムで何件処理したか確認したかったので、カラムごとにクエリを流しています。
パフォーマンスを重視するなら、文字列連結して一つのSQL文にしたあと、whileの外で一度だけクエリを流すとよいでしょう。