Dynamic SQL Query to ignore null values based on null value in cell

前端 未结 3 1398
一向
一向 2021-01-28 05:10

I have a dynamic SQL query with different column names and tables at runtime.

I am looking to get the SQL query to ignore reading data based on if a row contains Null v

相关标签:
3条回答
  • 2021-01-28 05:50

    I am not sure what you mean by dynamic, but if you mean that you actually build your queries at runtime, then you can get all available column names of all columns (that are nullable or not) for a given table in a given database, then you can simply put them together for your desired query.

    In MySQL you can do that like this:

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

    In SQL-Server you can do it like this

    (provided you already selected the correct database) (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;
    

    And in Oracle you can do it like this:

    (having already selected the appropriate database)

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

    Not sure if this is a general Oracle-thing (as I am working mostly with SQL-Server), but when I tried this out with a fiddle, the table name I had to specify was always in uppercase letters.

    0 讨论(0)
  • 2021-01-28 05:51

    I believe you will need to use a stored procedure or multiple joins(which might not be the healthiest solution) to solve this as Marc B indicated. You can also check the following question that addresses the same issue you are asking about.

    0 讨论(0)
  • 2021-01-28 05:57

    No, there's no select where * is not null-type query. You have to test every field individually:

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

    You could try a COALESCE() operation, perhaps, but that's still ugly:

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

    but then you STILL have to list all of the fields in the table.

    0 讨论(0)
提交回复
热议问题