如何仅检索Oracle

时间:2018-05-03 10:39:31

标签: oracle oracle11g oracle10g

我有表结构和数据如下  https://ibb.co/mkGp67

我想要一个SQL查询只检索那些至少有一个非空值的列的数据,在上面的例子中我希望数据出来

https://ibb.co/mz9967

即。我不需要列Col2,Col5和Col6,同样具有所有空值的列也不固定。

请让我知道一个SQL查询,该查询只检索那些只有那些没有空值的数据的数据,如上所述。

4 个答案:

答案 0 :(得分:0)

据我所知,到目前为止,您无法通过SQL查询实现此目的。 SELECT语句的一个强有力的假设是返回列的列表是静态的 - 在查询中定义,而不是由数据定义。即使对于PIVOT查询(可用 - 据我所知 - 从Oracle 11开始),列的列表在查询中定义,通过提供要转换为列的值列表必须明确给出。

您正在寻找的是某种代码,动态生成查询。这可以是PL / SQL,返回游标引用或任何应用程序代码。

修改

您可以对查询执行的操作是清楚地了解哪些列包含空值,哪些不包含空值等等。它可能看起来像这样:

SELECT CASE
         WHEN COUNT(*) = 0 THEN 'no rows'
         WHEN COUNT(Col1) = 0 THEN 'all NULLs'
         WHEN COUNT(Col1) = COUNT(*) THEN 'no NULLs'
         ELSE 'some NULLs'
       END Col1NullStatus,
       CASE
         WHEN COUNT(*) = 0 THEN 'no rows'
         WHEN COUNT(Col2) = 0 THEN 'all NULLs'
         WHEN COUNT(Col2) = COUNT(*) THEN 'no NULLs'
         ELSE 'some NULLs'
       END Col2NullStatus,
       CASE
         WHEN COUNT(*) = 0 THEN 'no rows'
         WHEN COUNT(Col3) = 0 THEN 'all NULLs'
         WHEN COUNT(Col3) = COUNT(*) THEN 'no NULLs'
         ELSE 'some NULLs'
       END Col3NullStatus,
       CASE
         WHEN COUNT(*) = 0 THEN 'no rows'
         WHEN COUNT(Col4) = 0 THEN 'all NULLs'
         WHEN COUNT(Col4) = COUNT(*) THEN 'no NULLs'
         ELSE 'some NULLs'
       END Col4NullStatus,
       CASE
         WHEN COUNT(*) = 0 THEN 'no rows'
         WHEN COUNT(Col5) = 0 THEN 'all NULLs'
         WHEN COUNT(Col5) = COUNT(*) THEN 'no NULLs'
         ELSE 'some NULLs'
       END Col5NullStatus,
       CASE
         WHEN COUNT(*) = 0 THEN 'no rows'
         WHEN COUNT(Col6) = 0 THEN 'all NULLs'
         WHEN COUNT(Col6) = COUNT(*) THEN 'no NULLs'
         ELSE 'some NULLs'
       END Col6NullStatus
  FROM myTable

请参阅SQL Fiddle for the above

编辑2:

此查询的输出如下所示:

Col1NullStatus | Col2NullStatus | Col3NullStatus | Col4NullStatus | Col5NullStatus | Col6NullStatus
---------------+----------------+----------------+----------------+----------------+----------------
no NULLs       | all NULLs      | some NULLs     | no NULLs       | all NULLs      | all NULLs

这是您可能正在使用的格式,用于发布输入数据和预期结果。

答案 1 :(得分:0)

所以,既然你没有给出正式的表结构,并且你似乎混淆了数字和字符,我将尽我所能尝试进行一个至少会产生你想要的结果的查询。

创建表foo为( col1 varchar(10), col2 varchar(10), col3 varchar(10), col4 varchar(10), col5 varchar(10), col6 varchar(10) );

选择*    CASE cust1 WHEN null然后'null'否则cust1作为cust1结束,    CASE cust2 WHEN null然后'null'否则cust1作为cust1结束,    CASE cust3 WHEN null然后'null'否则cust1作为cust1结束,    CASE cust4 WHEN null然后'null'否则cust1作为cust1结束,    CASE cust5 WHEN null然后'null'否则cust1作为cust1结束,    CASE cust6 WHEN null然后'null'否则cust1作为cust1结束 来自foo;

答案 2 :(得分:0)

    columns={[

        {
           accessor: 'myAcc',
           Header: //any jsx or string here,
           getProps: () => getProps(redCell), // return CSS
           Cell: (rowInfo): JSX.Element => //you can render your jsx for the cell. 
        },
   ]}

答案 3 :(得分:0)

我通常会分三个步骤进行操作。

首先,确保表统计信息是最新的。检查last_analyzed是否晚于对该表的最后一次更改。

SELECT last_analyzed FROM user_tables WHERE table_name = 'MYTABLE';

如有疑问,请使用

更新统计信息
BEGIN dbms_stats.gather_table_stats('MYSCHEMA','MYTABLE'); END;
/

现在,视图user_tab_columns具有一列num_nulls。这是此列为NULL的行数。如果该值与表中的行数相同,则所有行均为NULL。这可以用来让Oracle生成所需的SQL:

WITH 
  qtab AS (SELECT owner, table_name, num_rows
             FROM all_tables 
            WHERE owner='SCOTT'            -- change to your schema
              AND table_name='EMPLOYEES'   -- change to your table name
           ),
  qcol AS (SELECT owner, table_name, column_name, column_id
             FROM qtab t 
             JOIN all_tab_columns c USING (owner, table_name)
            WHERE c.nullable = 'N'         -- protected by NOT NULL constraint 
               OR c.num_nulls = 0          -- never NULL
               OR c.num_nulls < t.num_rows -- at least 1 row is NOT NULL
              )  
              )  
SELECT 'SELECT '||LISTAGG(column_name,',') WITHIN GROUP (ORDER BY column_id)||
        ' FROM '||owner||'.'||table_name||';' AS my_query
  FROM qcol
 GROUP BY owner, table_name;

这将输出类似

的查询
SELECT col1, col3, col4, col5 FROM myschema.mytable;

现在可以执行此查询以显示列值。