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