Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 排除其中没有数据的列_Sql_Oracle - Fatal编程技术网

Sql 排除其中没有数据的列

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

使用甲骨文与蟾蜍

我有一个类似这样的表(第2列和第4列为空,第1列、第3列和第5列包含数据):

我想做一个简单的选择,排除其中没有数据的列(=第2列和第4列),或者换句话说,只选择其中有数据的列。 是否有一个select命令,例如
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;