0

古い、より自由奔放な時間にまとめられた一連のデータベースを新しいスキーマに解析する作業に取り組んでいます。基本的には、foo98、foo99、foo2000 などのデータベース名で、1 年に 1 つのデータベースです。

したがって、最新の foo データについては、次のようなことができます

SELECT foo_person.mdname AS middle_name,
...
FROM foo_person, foo_place, foo_thing

以前のバージョンの foo データベースに戻ると、ミドル ネームは保存されません。次のようなユニバーサルクエリを作成しようとしました。

SELECT IFNULL(foo_person.mdname, "") AS middle_name,
...
FROM foo_person, foo_place, foo_thing

しかし、MySQL は不明な列 foo_person.mdname について不平を言います。これは、存在しないため完全に合理的です。

存在しない列を MySQL 構文だけで処理する方法はありますか? または、データベース固有のインポート クエリを作成する必要がありますか?

4

5 に答える 5

2

SQL で存在しない列を処理する方法はありません (空の列とは対照的に)。

次のように、information_schema テーブルを使用して、列が存在するかどうかを確認できます。

select * from information_schema.columns
    where table_name='mytable' and table_schema='mydatabase';
于 2009-10-20T18:18:27.580 に答える
2

はい、方法があります。

これらのデータベースを考えてみましょう

  • DB2009 には、Fname、MInitial、および LName を持つ Person があります
  • DB2008 には Fname と LName を持つ Person があります
  • DB2007 には PersonName を持つ Person があります

次のようなことができます(これはMS SQL Server用に書きました)

/*all three columns exist*/
SELECT FName, MInitial, LName
From DB2009.Person

UNION

/*one column is a forced null */
SELECT FName, NULL as MInitial, LName
From DB2008.Person

UNION

/*two columns are derived and one column is a forced null */
SELECT SubString (1, CharIndex (PersonName, ' '), PersonName) as FirstName,
       NULL as MInitial, 
       SubString (CharIndex (PersonName, ' '), len (PersonName), PersonName),
From DB2007.Person
于 2009-10-20T18:25:06.827 に答える
1

テーブルの名前を変更し、欠落している列のある場所にビューを作成していただけますか?

これがあなたが探しているものかどうかはわかりませんが、私はそれを提案すると思いました.

-- Here is your original table
create table t (fname varchar(30), lname varchar(30));

-- Rename it to something else
alter table t rename to tOrig;

-- Create a view with the columns its missing that you need
create view t as select fname, lname, '' as mname from tOrig;
于 2009-10-20T18:29:07.280 に答える
0

異種データベースを使用している場合は、とにかくデータベース固有のインポート クエリを使用します。一部の列を結合して一部を削除し、一部を切り捨てる必要がある場合があります。

于 2009-10-20T18:15:16.020 に答える
0

より複雑な sql クエリを作成する代わりに、foo98 および foo99 テーブルを変更して、不足している列を追加する方がよいでしょう。

たとえば、「mdname」という名前の varchar(30) 型の列を foo98 に追加するには、次のようにします。

ALTER TABLE foo98 ADD mdname varchar(30) AFTER first_name;

次に、アクセスするテーブルに関係なく、リラックスして同じ単純な SQL クエリを使用できます。

于 2009-10-20T18:36:06.670 に答える