Sql 排除其中没有数据的列
使用甲骨文与蟾蜍 我有一个类似这样的表(第2列和第4列为空,第1列、第3列和第5列包含数据): 我想做一个简单的选择,排除其中没有数据的列(=第2列和第4列),或者换句话说,只选择其中有数据的列。 是否有一个select命令,例如Sql 排除其中没有数据的列,sql,oracle,Sql,Oracle,使用甲骨文与蟾蜍 我有一个类似这样的表(第2列和第4列为空,第1列、第3列和第5列包含数据): 我想做一个简单的选择,排除其中没有数据的列(=第2列和第4列),或者换句话说,只选择其中有数据的列。 是否有一个select命令,例如select*fromtest_table,其中列不为NULL(这是伪代码,只是为了澄清我的问题) 结果应该如下所示: column_1 column_3 column_5 a1 b1 c1 a2 b2
select*fromtest_table,其中列不为NULL
(这是伪代码,只是为了澄清我的问题)
结果应该如下所示:
column_1 column_3 column_5
a1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
您必须执行三步方法,但这在很大程度上是乏味的,但在sqlplus中是可以做到的 1) 首先确定为空的列 2) 定义没有这些列的标题 3) 定义没有这些列的主体
WITH data AS
(
SELECT '1' a,
'' b ,
2 c ,
'' d,
5 e
FROM dual
UNION ALL
SELECT '7' a,
'' b ,
2 c ,
'' d,
6
FROM dual
UNION ALL
SELECT '3' a,
'' b ,
3 c ,
'' d,
7
FROM dual
UNION ALL
SELECT '4' a,
'' b ,
3 c ,
'' d,
8
FROM dual
UNION ALL
SELECT '5' a,
'' b ,
2 c ,
'' d,
9
FROM dual),d1 AS
(
SELECT First_value(a) ignore nulls over (PARTITION BY a ORDER BY ROWNUM) ca,
first_value(b) ignore nulls over (PARTITION BY b ORDER BY ROWNUM) cb,
first_value(c) ignore nulls over (PARTITION BY c ORDER BY ROWNUM) cc,
first_value(d) ignore nulls over (PARTITION BY d ORDER BY ROWNUM) cd,
first_value(e) ignore nulls over (PARTITION BY e ORDER BY ROWNUM) ce
FROM data
WHERE ROWNUM=1 ),
d2 as (SELECT 0 rw,
CASE
WHEN ca IS NOT NULL THEN 'a'
ELSE ''
END
||chr(9)
||
CASE
WHEN cb IS NOT NULL THEN 'b'
ELSE ''
END
||chr(9)
||
CASE
WHEN cc IS NOT NULL THEN 'c'
ELSE ''
END
||chr(9)
||
CASE
WHEN cd IS NOT NULL THEN 'd'
ELSE ''
END
||chr(9)
||
CASE
WHEN ce IS NOT NULL THEN 'e'
ELSE ''
END as DATA1
FROM d1
UNION ALL
SELECT
rownum rw,
a
||chr(9)
||b
||chr(9)
||c
||chr(9)
||d
||chr(9)
||e
FROM data)
select /*ansiconsole*/ DATA1
from d2 order by rw asc;
在标准SQL中,查询返回一组固定的列。你所要求的是动态SQL。我同意@GMB,我认为唯一的方法是分两个阶段。首先查找只有空值的列,然后执行不包含这些列的SQL查询。当然,您可以编写PL/SQL代码来组合这两个操作。@GMB@Abra我正在尝试类似于从test_表中选择*,其中“column”为空代码>但不返回任何内容(也没有错误消息)。这段代码是否接近我应该做的来查找空列?空列是否等于只有空值的列?
从test_表中选择count(*),其中“column”不为空
如果查询返回0(零),则test_表中“column”的所有值都为空。请注意,空列等于只有空值的列。您好,谢谢!您知道有什么方法可以自动识别空列吗?如果First_value(a)ignore nulls over(按ROWNUM排序的分区)为null,则该列为null
WITH data AS
(
SELECT '1' a,
'' b ,
2 c ,
'' d,
5 e
FROM dual
UNION ALL
SELECT '7' a,
'' b ,
2 c ,
'' d,
6
FROM dual
UNION ALL
SELECT '3' a,
'' b ,
3 c ,
'' d,
7
FROM dual
UNION ALL
SELECT '4' a,
'' b ,
3 c ,
'' d,
8
FROM dual
UNION ALL
SELECT '5' a,
'' b ,
2 c ,
'' d,
9
FROM dual),d1 AS
(
SELECT First_value(a) ignore nulls over (PARTITION BY a ORDER BY ROWNUM) ca,
first_value(b) ignore nulls over (PARTITION BY b ORDER BY ROWNUM) cb,
first_value(c) ignore nulls over (PARTITION BY c ORDER BY ROWNUM) cc,
first_value(d) ignore nulls over (PARTITION BY d ORDER BY ROWNUM) cd,
first_value(e) ignore nulls over (PARTITION BY e ORDER BY ROWNUM) ce
FROM data
WHERE ROWNUM=1 ),
d2 as (SELECT 0 rw,
CASE
WHEN ca IS NOT NULL THEN 'a'
ELSE ''
END
||chr(9)
||
CASE
WHEN cb IS NOT NULL THEN 'b'
ELSE ''
END
||chr(9)
||
CASE
WHEN cc IS NOT NULL THEN 'c'
ELSE ''
END
||chr(9)
||
CASE
WHEN cd IS NOT NULL THEN 'd'
ELSE ''
END
||chr(9)
||
CASE
WHEN ce IS NOT NULL THEN 'e'
ELSE ''
END as DATA1
FROM d1
UNION ALL
SELECT
rownum rw,
a
||chr(9)
||b
||chr(9)
||c
||chr(9)
||d
||chr(9)
||e
FROM data)
select /*ansiconsole*/ DATA1
from d2 order by rw asc;