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 表中具有所需的结果。