说我不确定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 ...;
Run Code Online (Sandbox Code Playgroud)
这是您感兴趣的查询:
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ‘tablename’ AND COLUMN_NAME = ‘column’)
Run Code Online (Sandbox Code Playgroud)
您可以将其包含在将表名和列名作为参数的函数中,然后在查询中使用它.
仍然不确定这是否会起作用,因为查询可能仍然由于在查询中引用不存在的列而错误输出(即使IF在列不存在时总是返回false)
另一种选择是使用该函数动态构建查询,而不是尝试在查询本身中使用它.但那当然会变得有点复杂.
最终,最好的方法是使用存储过程而不是将查询放在代码中.这样,当数据库升级时,sproc也会"升级"以匹配新架构,您不必担心(尽可能多)代码版本是否与数据库版本匹配.