mysql - SQL 查询从数据库中删除空值/空白值(特定于 DB2 和 Teradata)

标签 mysql sql database db2 teradata

我正在开发一个使用外部数据源的应用程序。我的应用程序支持多个数据库(即 MySQl、MsSQl、Teradata、Oracle、DB2 等)。当我创建数据源时,我允许用户将主键 (pk) 分配给数据源。现在,我不检查用户选择的列在实际数据库中是否是主键。我只是希望,在从数据库中检索数据时,用户选择的主键 中具有空值/空值的记录应该被删除。我创建了一个过滤器,支持除 DB2 和 Teradata 之外的所有其他数据库。

其他数据库的示例查询:

  1. Select * from MY_TABLE where PK_COLUMN IS NOT NULL and PK_COLUMN !='';
  2. 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) !=''

我的问题:

  1. 此解决方案(双重转换)是否支持 DB2 和 Teradata 中的所有数据类型?
  2. 如果不能,我能想出更好的解决方案吗?

最佳答案

当然,您可以在 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/

相关文章:

尽管没有出现错误,Java SQL 更新语句并未在表中更新

mysql - 附加两个具有相同字段的 sql 查询的结果

sql - 每次出现都依赖于不同的where子句时的基本sql : selecting the same column multiple times in one query,

database - WinRT/Metro 应用程序的本地数据库存储

mysql - 为什么操作数应该只包含一列?

database - 我应该以大写还是小写形式将所有文本存储在数据库中?

mysql - 使用 MySQL 和多个表选择所有未打开电子邮件的订阅者

php - 如何按受欢迎程度对文章进行排序?

sql - 为什么它们的表之间存在没有关系的数据库?

sql - PostgreSQL:如何从 Unix 纪元转换为日期?