sql—选择表中可能存在或不存在的列名,并获取null值而不是error

gajydyqb  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(381)

在vertica中,是否有方法选择表中可能存在或不存在的列,如果该列不存在,则获取null作为值?
用例是从许多表中堆叠数据,并编写一个脚本来实现这一点。不是所有的列都存在于所有的表中,所以我想编写一个这样的脚本,在特定的表中不存在某个列的地方只获取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,否则为空

gr8qqesn

gr8qqesn1#

如果性能不重要,请尝试vertica flex表:

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)
hs1ihplo

hs1ihplo2#

如果表有主键,可以尝试:

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 将从子查询中“满足”-if t 有列。否则,它将到达外部查询并选择 x ,因为 t 也不会有专栏。

相关问题