【问题标题】:Dynamic SQL Query to ignore null values based on null value in cell基于单元格中的空值忽略空值的动态 SQL 查询
【发布时间】:2014-06-24 15:31:45
【问题描述】:

我有一个动态 SQL 查询,在运行时具有不同的列名和表。

我希望让 SQL 查询忽略基于行是否在任何单元格中包含 Null 值的读取数据。

SELECT rsv_intension_rsvt 
FROM resolve_table_kb 
where rsv_intension_rsvt is not null;

我知道使用IS NOT NULL。

但问题是我不知道查询语法(即列名,以便可以使用IS NOT NULL)。

是否存在动态解决方案,该动态解决方案仅用于SQL查询仅在所选行中的所有单元格不为空时才能读取/收集行。

谢谢

【问题讨论】:

    标签: mysql sql sql-server oracle


    【解决方案1】:

    我不确定dynamic 是什么意思,但如果您的意思是您实际上是在运行时构建查询,那么您可以获得给定表的所有列(是否可为空)的所有可用列名在给定的数据库中,您可以简单地将它们放在一起以进行所需的查询。

    在 MySQL 中,你可以像 this 那样做:

    SELECT
            COLUMN_NAME
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE
            table_name = '<TABLE_NAME>'
            AND IS_NULLABLE = 'YES'
            AND TABLE_SCHEMA='<DB_NAME>';
    

    在 SQL-Server 中你可以这样做

    (前提是您已经选择了正确的数据库)(tables reference,columns reference)

    SELECT
            Cols.name
        FROM sys.all_columns AS Cols
        INNER JOIN sys.tables AS Tabs ON Cols.object_id = Tabs.object_id
        WHERE
            Tabs.name = '<TABLE_NAME>'
            AND Cols.is_nullable = 1;
    

    在 Oracle 中,您可以像 this 那样做:

    (已经选择了合适的数据库)

    SELECT
        COLUMN_NAME
      FROM ALL_TAB_COLUMNS
      WHERE
        TABLE_NAME = '<TABLE_NAME>'
        AND NULLABLE = 'Y';
    

    不确定这是否是一般的 Oracle 事物(因为我主要使用 SQL-Server 工作),但是当我用小提琴尝试这个时,我必须指定的表名总是大写字母.

    【讨论】:

      【解决方案2】:

      我相信您将需要使用存储过程或多个连接(这可能不是最健康的解决方案)来解决此问题,如Marc B 所示。您还可以查看以下question,它解决了您所询问的同一问题。

      【讨论】:

        【解决方案3】:

        不,没有select where * is not null-type 查询。您必须单独测试每个字段:

        SELECT ...
        FROM ...
        WHERE field1 is not null AND field2 is not null AND .... AND fieldN is not null
        

        也许你可以尝试COALESCE() 操作,但这仍然很难看:

        WHERE COALESCE(field1, field2, ..., fieldN, 'allarenull') <> 'allarenull'
        

        但是您仍然必须列出表中的所有字段。

        【讨论】:

          猜你喜欢
          • 2011-02-12
          • 1970-01-01
          • 2019-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          • 2011-02-14
          • 1970-01-01
          相关资源
          最近更新 更多