【发布时间】:2014-10-07 19:09:18
【问题描述】:
我正在开发一个使用外部数据源的应用程序。我的应用程序支持多个数据库(即 MySQl、MsSQl、Teradata、Oracle、DB2 等)。当我创建数据源时,我允许用户将主键(pk)分配给数据源。现在,我不检查用户选择的列是否是实际数据库中的主键。我只是希望,在从数据库中检索数据时,用户选择的主键中具有空值/空白值的记录应该被删除。我创建了一个过滤器,它支持除 DB2 和 Teradata 之外的所有其他数据库。
其他数据库的示例查询:
Select * from MY_TABLE where PK_COLUMN IS NOT NULL and PK_COLUMN !='';Select * from MY_TABLE where PK_COLUMN IS NOT NULL AND cast(PK_COLUMN as varchar) !=''
DB2 和 Teradata:
PK_COLUMN !='' 和 cast(PK_COLUMN as varchar) !='' 条件会导致 DB2 和 teradata 中的 int 数据类型出错,因为:
- int 类型的列不能满足上述条件,也不能在 DB2 和 Teradata 中将 int 类型的列直接转换为 varchar。
我想创建一个查询以从数据库中删除空值/空白值,并提供表名和用户 pk 列名作为字符串。 (创建查询时我不知道 pk_column_type,所以查询应该是统一的以支持所有数据类型)
注意:这里的 pk 不是实际的 pk,它只是我的应用程序用户分配的虚拟 pk。所以这可以是一个普通的列,因此可以有空值/空白值。
我创建了一个查询:
Select * from MY_TABLE where PK_COLUMN IS NOT NULL AND cast(cast(PK_COLUMN as char) as varchar) !=''
我的问题:
- 此解决方案(双重转换)是否支持 DB2 和 Teradata 中的所有数据类型?
- 如果不行,我能想出更好的解决方案吗?
【问题讨论】:
标签: mysql sql database db2 teradata