动态SQL查询根据单元格中的空值忽略空值

时间:2014-05-07 15:04:07

标签: mysql sql sql-server oracle

我在运行时使用不同的列名和表进行动态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查询的动态解决方案,仅当所选行中的所有单元格都为NOT NULL时才读取/收集行。

由于

3 个答案:

答案 0 :(得分:0)

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

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'

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不确定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 referencecolumns 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),但是当我用小提琴尝试这个时,我必须指定的表名始终是大写字母