测试是否存在列

时间:2009-12-31 14:15:50

标签: sql mysql

说我不确定数据库t中的表d是否有列x。也许这是因为应用程序使用的某些数据库已经升级而有些数据库没有升级,因此有些数据库有t.x而有些数据库没有。

现在说我只需要一个简单的查询来从d.t获取一行,如果列存在,我想要d.t.x的值,如果不存在,我想要一些默认值。

我知道如何使用两个查询来执行此操作,其中第一个查询是否存在列x并且应用程序相应地调整第二个查询。但是,我可以将此逻辑移动到SQL中并在一个查询中执行吗?如果有COLUMN_EXISTS()函数,那么查询将是:

SELECT s, t, IF(COLUMN_EXISTS(x), x, 'NO_COL_x') AS x FROM d.t ...;

3 个答案:

答案 0 :(得分:7)

以下是您感兴趣的查询:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ‘tablename’ AND COLUMN_NAME = ‘column’)

你可以把它包装在一个以表名和列名作为参数的函数中,然后在你的查询中使用它。

仍然不确定这是否会起作用,因为查询可能仍然由于在查询中引用不存在的列而导致错误(即使IF在列不存在时总是返回false)< / p>

另一种选择是使用该函数动态构建查询,而不是尝试在查询本身中使用它。但那当然会变得更加复杂。

最终,最好的方法是使用存储过程而不是将查询放在代码中。这样,当数据库升级时,sproc也会“升级”以匹配新架构,您不必担心(尽可能多)代码版本是否与数据库版本匹配。

答案 1 :(得分:1)

有一个视图INFORMATION_SCHEMA.COLUMNS,其中包含表列和column_name。如果您需要查看表中是否存在列,可以从那里进行选择。

答案 2 :(得分:1)

您可能正在寻找:

SHOW COLUMNS FROM my_table LIKE 'my_column'