我正在开发一个使用外部数据源的应用程序。我的应用程序支持多个数据库(即 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 列名作为字符串的数据库中删除 null/空白值。 (我在创建查询时不知道 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 中的所有数据类型?
- 如果不能,我能想出更好的解决方案吗?
最佳答案
当然,您可以在 Teradata 和 DB2 中将 INT 转换为 VARCHAR,但是您必须指定 VARCHAR 的长度,没有默认长度。
转换为没有长度的 CHAR 在标准 SQL 中默认为 CHAR(1),这可能会导致一些“字符串截断”错误。
您需要转换为 VARCHAR(n),其中 n 是基于 DBMS 的最大长度。
此外,SQL 中没有 != 运算符,应该用 > 代替。
最后,空字符串和 NULL 之间存在根本区别(Oracle 除外),一个或多个空格也可能有意义,并且在与 '' 进行比较时将被过滤掉。
空 INT 应该是什么?如果您的查询有效,零将被强制转换为不等于“”的“0”,因此它将失败。
您应该简单地使用 IS NOT NULL 并仅对字符列添加空字符串检查(并添加一个选项供用户决定空字符串是否等于 NULL)。
关于mysql - SQL 查询从数据库中删除空值/空白值(特定于 DB2 和 Teradata),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302853/