質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

44914閲覧

SQL全テーブル検索

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/09/03 02:50

データベースの全テーブルから、特定の文字列検索したいのですが、
何かいい方法はありませんか?

例えば、顧客から、
システムに表示されている「首相」という文字を
すべて「総理」という表記に変更したいという要望があったとします。
システム上「首相」と表示している画面は複数あります。

「首相」という文字列は、すべてデータベースで設定されているとします。
データベースには複数テーブルがありますが、どのテーブルのどのカラムで
「首相」という文字列を設定しているかはわかりません。
システムは大規模なので、仕様書ベースで影響範囲を調査するのは困難とします。

そこで、どのテーブルのどのカラムに「首相」という文字列が
設定されているのかを確認したいのですが、
何かいい方法はありませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

質問者様の望んでおられる、
ピンポイントで検索文字列が設定されたテーブル内のカラムの特定はなかなか難しそうなので(ストアドでバッチ化すればもしかすると不可能ではない?)、

当方の思いつく限りで何個か提案してみます。

#データベース単位でデータエクスポートして検索文字列を探す
データベースのdump機能などでテーブルとデータをエクスポートし、
それをエディタのGrep検索などで当たりをつけていく方法です。

DBMSによるかもですが、
dumpにはINSERT文としてごと吐き出す等の機能もあるので、
格納されたテーブルとカラムの特定は比較的容易かと思います。

少なくとも仕様書ベースに探すよりは時間が削減できるかと思われます。

#ストアドを作成してゴリゴリと
これもDBMSごとに依存しそうですが、
ストアドで「首相」が設定されたテーブル・レコードをテキスト形式で吐き出すくらいは出来るかもしれません。
0. 検索したいデータベース内のテーブルリストをDBMSのカタログより取得
0. テーブルごとのカラムリストを取得
0. 動的にSQLを作成し、検索結果をテキストファイルか何かに落とす

3番目にて組み立てるSQLは以下のようなイメージ

  • テーブル定義

SQL

1CREATE TABLE table_1( 2 HOGE VARCHAR(10) PRIMARY KEY 3, FUGA VARCHAR(4) 4, PIYO INT 5)
  • 動的SQL

SQL

1SELECT 2 t.* 3FROM 4 table_1 t 5WHERE 6 '首相' IN (t.HOGE, t.FUGA) -- この箇所で指定するカラムは文字列型でないとエラーとなる

ただ上記のようなストアドを作るのもなかなか骨が折れるかもかもしれませんし、
テーブル数、データ数が莫大ともなると実行自体がなかなか終わらないと思われるので(途中でこけたりしたら悲惨)、
採用するに当たっては慎重に検討してください。

#ただ本来の理想を言うと
データがあちこちに散らばっている現状が非常にまずいです。

今回は一時対応でことなきを得たとしても、
同じような状況が再度起こった際再び対応時間が取られるとなると、
非効率極まりません。

システム規模が大きいということから、
大変であろうことは承知で申し上げますと、
例えば項目名マスタとか1つのマスタテーブルをこしらえて、
システムの各機能はそのテーブルを参照するように変更した方が合理的です。

今すぐ対応するというのは困難かもしれませんが、
長期的に見るとテーブル構成の見直しが一番最適解となるので、
そちらも考慮に入れてみてはいかがでしょうか?

データベースの本来の姿としては、
テーブルとカラムをもってデータが識別されるのであって、
登録されたデータからテーブルなりカラムを識別するものではないため、
今回のような処理では、DB単体では不得手となるのは致し方ない所です。

投稿2016/09/03 03:31

編集2016/09/03 04:00
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/03 06:19

回答ありがとうございます。 dumpファイルをgrepで検索するの方法を 試してみようと思います。
guest

0

顧客名が変更になって顧客マスタを変更すれば済むだけみたいな案件で、正規化以前のレベルで顧客名があちこちに散らばっているとんでもないテーブル設計で同様のUPDATE文を書いて対応したことがあります。
顧客名の列名がCUSTOMER_NAMEだったか?で統一されていたので、ALL_TAB_COLUMNSでCUSTOMER_NAMEが使われているテーブルをUPDATEするSQLをSPOOLしてリダイレクトするだけでしたが。

投稿2016/09/04 20:10

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

-評価だったので、少し編集。

データベースの全テーブルから、特定の文字列検索したいのですが、

何かいい方法はありませんか?

システム上「首相」と表示している画面は複数あります。
「首相」という文字列は、すべてデータベースで設定されているとします。

以下の手順でしょうか。

1.全テーブルのVARCHAR等の全カラムについてのみ、以下のようなSQLで抽出する。

SQL

1SELECT カラム名 as BEFORE 2 , REPLACE(カラム名,'首相','総理') as AFTER 3FROM テーブル名 4WHERE カラム名 like '%首相%' 5;

2.上記SQLで引っかかったカラムに対して、以下のSQLを実行する。

SQL

1UPDATE テーブル名 2 カラム名 = REPLACE(カラム名,'首相','総理') 3WHERE カラム名 like '%首相%' 4;

上記SQLの作り方は、言語によって様々なので指定してほしいところ。
desc テーブル名; 等で
テーブルとカラムの一覧を取得してEXCEL等に貼り付けて、
="SELECT "&A2&" FROM "&A1&" WHERE "&A2&" like '%首相%';"
とコピーすればすぐに作れる。

まとめて実行したい場合、SQL文の最後に実行結果を
テーブル名+カラム名のファイル名でファイル出力しても良いでしょう。
(Oracleなら、USER_OBJECTS等でもテーブル名とカラム名は取得できる。)

なお、本来であれば、たとえ1000個以上のテーブルがあっても、
どんなテーブルがあり、どんなデータが格納されているかを把握したいところ。

投稿2016/09/03 03:50

編集2016/09/03 11:44
tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問