我有表结构和数据如下 https://ibb.co/mkGp67
我想要一个SQL查询只检索那些至少有一个非空值的列的数据,在上面的例子中我希望数据出来
即。我不需要列Col2,Col5和Col6,同样具有所有空值的列也不固定。
请让我知道一个SQL查询,该查询只检索那些只有那些没有空值的数据的数据,如上所述。
答案 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
编辑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;
现在可以执行此查询以显示列值。