【问题标题】:SQL query to drop null/blank values from Database (DB2 and Teradata specific)从数据库中删除空值/空白值的 SQL 查询(特定于 DB2 和 Teradata)
【发布时间】:2014-10-07 19:09:18
【问题描述】:

我正在开发一个使用外部数据源的应用程序。我的应用程序支持多个数据库(即 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 列名作为字符串。 (创建查询时我不知道 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. 如果不行,我能想出更好的解决方案吗?

【问题讨论】:

    标签: mysql sql database db2 teradata


    【解决方案1】:

    当然,您可以在 Teradata 和 DB2 中将 INT 转换为 VARCHAR,但您必须指定 VARCHAR 的长度,没有默认长度。

    在标准 SQL 中转换为没有长度的 CHAR 默认为 CHAR(1),这可能会导致一些“字符串截断”错误。

    您需要转换为 VARCHAR(n),其中 n 是基于 DBMS 的最大长度。

    另外,SQL 中没有 != 运算符,这应该是

    最后,空字符串和 NULL 之间存在根本区别(Oracle 除外),一个或多个空格也可能具有含义,并且在与 '' 相比时会被过滤掉。

    空的 INT 应该是什么?如果您的查询工作为零将被强制转换为不等于 '' 的 '0',所以它会失败。

    您应该简单地使用 IS NOT NULL 并仅为字符列添加空字符串检查(并为用户添加一个选项以决定空字符串是否等于 NULL)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      相关资源
      最近更新 更多