sql - 如何动态选择非空值列?

我创建了如下表格。我只想动态选择 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

最佳答案

以下查询生成您要通过一些动态 SQL 过程执行的查询。

不幸的是,我不太了解 Oracle 语法,以下是 PostgreSQL 中的语法,但我想您只需将 string_agg 更改为相关的 Oracle 函数连接字符串即可。

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;

https://stackoverflow.com/questions/44904200/

相关文章:

python - 从 Sphinx autodoc 扩展中的文档中排除静态成员

sql - 使用 create table as select 时避免重复列名

.net-core - 带有私钥的证书.Net Core

ios - react-native-maps 为每个区域填充颜色

angularjs - headless Chrome : chrome not reachable

spring - 集成测试中的 Autowire JUnit 规则

sql - 错误 : "Connection failed: SQLState: ' 08001'

python - 如何从 YouTube 搜索中抓取视频?

sql - 使用 SQL 查询将 Excel 数据加载到 Azure SQL 中

laravel - smtp 中继 - g 套件 - 带有自定义域电子邮件的 gmail