首页 > 解决方案 > 选择表中可能存在或不存在的列名,并获取空值而不是错误

问题描述

在 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

标签: sqlvertica

解决方案


如果性能无关紧要,请尝试 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)

推荐阅读