Select table 中可能存在也可能不存在的列名,得到空值而不是错误

Select column name that may or may not exist in table, and get null value rather than error

在vertica中,有没有办法select一个可能存在也可能不存在的列table,如果该列不存在则获取null作为值?

用例是堆叠来自许多 table 的数据,并编写脚本来执行此操作。并非所有列都存在于所有 table 中,所以我想像这样编写一个脚本,并在特定 table.

中不存在特定列的情况下获取空值
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 

在我们的应用程序中,很难事先知道每个 table 是否都有每个命名列,如果没有,每个 table.

中缺少哪些列

编辑:参考相同的先前问题Select columnValue if the column exists otherwise null

如果table有主键,可以试试:

select . . . ,
       (select colx   -- no table alias!
        from t t2
        where t2.primary_key = t.primary_key
       ) as colx
from t cross join
     (select null as colx) x;

范围规则在 SQL 中的工作方式是 colx 将从子查询中“满足”——如果 t 有该列。否则,它将到达外部查询并选择 x 中的值,因为外部 t 也不会有该列。

如果性能不重要,请尝试 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)