sql - 选择表中可能存在或不存在的列名,并获取空值而不是错误
问题描述
在 vertica 中,有没有办法选择表中可能存在或不存在的列,如果该列不存在,则获取 null 作为值?
用例是从许多表中堆叠数据,并编写一个脚本来做到这一点。并非所有列都存在于所有表中,所以我想像这样编写一个脚本,并在特定表中不存在某个列的情况下获取空值。
SELECT * FROM
(SELECT field1, field2, ... field100 from table1 ) UNION ALL
(SELECT field1, field2, ... field100 from table2 ) UNION ALL
(SELECT field1, field2, ... field100 from table3 ) UNION ALL
(SELECT field1, field2, ... field100 from table4 ) UNION ALL
...
(SELECT field1, field2, ... field100 from tablen ) UNION ALL
在我们的应用程序中,很难预先知道每个表是否都有每个命名列,如果没有,每个表中缺少哪些列。
编辑:引用相同的先前问题 如果列存在则选择 columnValue 否则为 null
解决方案
如果性能无关紧要,请尝试 Vertica Flex Tables:
DROP TABLE IF EXISTS allcols;
DROP TABLE IF EXISTS allbut1;
DROP TABLE IF EXISTS allbut4;
CREATE FLEX TABLE allcols();
INSERT INTO allcols(col1,col2,col3,col4)
SELECT 1, 2, 3, 4
UNION ALL SELECT 11, 12, 13, 14
;
CREATE FLEX TABLE allbut1();
INSERT INTO allbut1(col2,col3,col4)
SELECT 22, 23, 24
UNION ALL SELECT 32, 33, 34
;
CREATE FLEX TABLE allbut4();
INSERT INTO allbut4(col1,col2,col3)
SELECT 21, 22, 23
UNION ALL SELECT 31, 32, 33
;
COMMIT;
\pset null (null)
SELECT col1,col2,col3,col4 FROM allcols
UNION ALL SELECT col1,col2,col3,col4 FROM allbut1
UNION ALL SELECT col1,col2,col3,col4 FROM allbut4
;
-- out col1 | col2 | col3 | col4
-- out --------+------+------+--------
-- out 1 | 2 | 3 | 4
-- out 11 | 12 | 13 | 14
-- out (null) | 22 | 23 | 24
-- out (null) | 32 | 33 | 34
-- out 21 | 22 | 23 | (null)
-- out 31 | 32 | 33 | (null)
推荐阅读
- html - 具有纯色圆形背景的图像
- tensorflow - 一个实例有多个 GPU 或多个实例有一个 GPU
- javascript - 我如何拥有可以在我的 react 应用程序中的任何文件中使用的资产文件,而不必总是导航到资产文件夹
- python-3.x - 如何查找在另一列的不同行中有多个值的列值的总长度
- oracle - 出现以下错误的进程外内存问题
- quarkus - Quarkus PanacheEntityBase 查询与 IN
- ios - 创建 Waves 可视化视频 Swift
- javascript - 如何在 Vite 和 Vue 3 中使用 Webassembly/wasm 模块?
- paypal - Braintree Google Pay 沙盒打开实时域
- javascript - 使用矩形移动绝对定位调整图标大小