0

致力于将一堆数据库在更旧、更自由的时间内组合成一个新模式。基本上它是每年一个数据库,数据库名称如 foo98、foo99、foo2000 等。

所以对于最近的 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 有 Person 和 PersonName

您可以执行以下类似操作(我为 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 回答