2017-07-04 123 views
2

我创建了如下表格。我想仅选择NOT NULL列(NO,NAME,SAL_1)。无需选择SAL,SAL_2。如何动态选择非空值列?

注意:最初我不知道列值。

create table sample(no integer,name varchar(20),sal integer,sal_1 integer,sal_2 integer); 
insert into sample(name,sal_1) values('aaa',10); 
insert into sample(no,name,sal_1) values(20,'',20); 
insert into sample(sal_1) values(30); 

select * from sample; 

数据,如低于

NO  NAME SAL SAL_1 SAL_2 
20  (null) (null) 20 (null) 
(null) (null) (null) 30 (null) 
(null) aaa  (null) 10 (null) 

预计OP:

NO  NAME SAL_1 
20  (null) 20 
(null) (null) 30 
(null) aaa  10 
+0

从样品 – mohan111

+0

中选择NO,Name,SAL_1 @Velu:So total no。列表中的列(即5列)将被固定,对吧? –

+0

@KeyurPanchal ..没有列是不固定的。在我的表格中有30列用于示例目的,我只给出了5. – Velu

回答

0

下面的查询生成你想通过一些动态SQL程序来执行查询。

不幸的是我不太清楚Oracle的语法,下面是PostgreSQL,但我想你只需要用相关的Oracle函数连接字符串来更改string_agg即可。

WITH columns (c) AS (
    SELECT 'no' WHERE EXISTS (SELECT * FROM sample WHERE no IS NOT NULL) 
    UNION 
    SELECT 'name' WHERE EXISTS (SELECT * FROM sample WHERE name IS NOT NULL) 
    UNION 
    SELECT 'sal' WHERE EXISTS (SELECT * FROM sample WHERE sal IS NOT NULL) 
    UNION 
    SELECT 'sal_1' WHERE EXISTS (SELECT * FROM sample WHERE sal_1 IS NOT NULL) 
    UNION 
    SELECT 'sal_2' WHERE EXISTS (SELECT * FROM sample WHERE sal_2 IS NOT NULL) 
) 
SELECT 'SELECT ' || string_agg(c, ', ') || ' FROM sample;' FROM columns; 
-1

试一试,

SELECT * FROM样本其中NVL(NO,0)> 0和NVL(长度(NAME),0)> 0和NVL(SAL_1,0)> 0

0

试试这个,

我已经检查过,并且完全符合你的输出。

select no,"NAME",sal_1 from sample having count(sal_1)>0 group by 
sal_1,name,no order by name desc