SQL - 仅从并非所有值均为空值的表中获取列

  • 本文关键字:空值 获取 SQL sql oracle
  • 更新时间 :
  • 英文 :


SQL问题: 如何从并非所有值都为 null 的列中获取所有列值?

表 A

COL1    COL2    COL3    COL4    COL5
---------------------------------------
abc     1       NULL    NULL    NULL
def     2       NULL    testA   NULL
NULL    3       NULL    testB   NULL
jkl     4       NULL    NULL    NULL

我想得到

COL1    COL2    COL4    
-----------------------
abc     1       NULL    
def     2       testA   
NULL    3       testB   
jkl     4       NULL    

有没有sql或plsql解决方案来实现这一点? 为了避免不相关的答案:假设我有一百万行。 我希望结果是视图或结果表。 不是书面输出。

我发现了一个类似的问题,但它不能满足我的需求: 如何从表中选择具有非空值的列?

可以通过此查询快速获取列名

select column_name 
from all_tab_columns 
where lower(table_name)='tableA' and num_distinct > 0;

我知道我可以用光标创建一个脚本,然后循环访问它,将结果添加到新的表或视图中。 这不是我需要的。我想知道这是否可以使用单个查询、使用透视/取消透视或其他东西来完成。

你所要求的在普通SQL中是不可能的,除非你提前知道哪些列只在任何地方都有NULL。(似乎你不想假设你知道这一点。

输出中包含哪些列 - 有多少列、它们的名称以及它们出现的顺序 - 必须在SELECT子句中进行硬编码,无法在运行时确定。另一方面,只有在读取数据(即运行时(后,您才会知道哪些列是全 NULL,否则您必须从外部源获得该信息。

执行您似乎想要做的事情的唯一方法是使用动态 SQL。这是一个高级主题,也是一种通常被认为是糟糕的商业实践的技术。

为什么不想显示具有全空值的列?你确定这个要求是有意义的吗?

请尝试以下步骤,可能会有所帮助:

Create table temp as (Select * from TableA)
Declare NbrRows Number(10);
plsql_block VARCHAR2(1000);
CountNullRows Number (10)
Select count(*) as nbr 
into NbrRows
from TableA
Select count(COL1) as nbr
into CountNullRows
from TableA where COL1 is null
if (NbrRows = CountNullRows) then
Alter table Temp drop column COL1
endif
Select count(COL2) as nbr
into CountNullRows
from TableA where COL2 is null
if (NbrRows = CountNullRows) then
Alter table Temp drop column COL2
endif
Select count(COL3) as nbr
into CountNullRows
from TableA where COL3 is null
if (NbrRows = CountNullRows) then
Alter table Temp drop column COL3
endif
...etc...

对所有列执行相同的操作

您在 Tem 表中具有所需的结果。

最新更新