【问题标题】:how to select not null values column dynamically?如何动态选择非空值列?
【发布时间】:2017-07-04 11:01:06
【问题描述】:

我创建了一个如下所示的表格。我只想动态选择 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)

预期操作:

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

【问题讨论】:

  • 从样本中选择 NO ,Name,SAL_1
  • @Velu:总之没有。表格中的列数(即 5 列)将被固定,对吗?
  • @KeyurPanchal ..没有列是不固定的。在我的表中有 30 列用于示例目的,我只给出了 5 列。

标签: sql oracle oracle11g


【解决方案1】:

以下查询通过一些动态 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;

【讨论】:

    【解决方案2】:

    试试这个,

    我已经检查并完全匹配您的输出。

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

    【讨论】:

      【解决方案3】:

      试试这个,

      select * from sample where nvl(NO,0)> 0 and nvl(length(NAME),0)>0 and nvl(SAL_1,0)>0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2011-01-14
        • 1970-01-01
        • 2014-02-10
        • 2012-07-26
        • 2022-06-20
        • 1970-01-01
        相关资源
        最近更新 更多