UNION,CASE和相关构造
SQL UNION/CASE构造必须把那些可能不太相似的类型匹配起来成为一个结果集。解析算法分别应用于联合查询的每个输出字段。EXCEPT构造对不相同的类型使用和UNION相同的算法进行解析。
UNION/CASE将两种类型的表达式转换为统一的目标类型,并通过隐式类型转换将数据转换为目标类型,实现聚合。
UNION和相关构造解析
UNION分为UNION和UNION ALL。UNION将数据聚合并进行去重处理,UNION ALL只聚合数据,不做去重处理。
示例:
-- 创建表
m_db=# CREATE TABLE test_union1 (union_col1 INT);
m_db=# CREATE TABLE test_union2 (union_col2 CHAR(5));
-- 插入数据
m_db=# INSERT INTO test_union1 VALUES (123);
m_db=# INSERT INTO test_union2 VALUES ('123');
-- union用法
m_db=# SELECT union_col1 FROM test_union1 UNION SELECT union_col2 FROM test_union2;
union_col1
------------
123
(1 row)
-- union all用法
m_db=# SELECT union_col1 FROM test_union1 UNION ALL SELECT union_col2 FROM test_union2;
union_col1
------------
123
123
(2 rows)
-- 非列值UNION应用
m_db=# SELECT '234' FROM test_union1 UNION SELECT '234';
?column?
----------
234
(1 row)
-- 删除表
m_db=# DROP TABLE test_union1;
m_db=# DROP TABLE test_union2;
CASE和相关构造解析
CASE语法一共有两种表达方式,两种方式功能含义相同:
CASE WHEN col = A THEN ... ELSE ...
CASE col WHEN A THEN ... ELSE ...
示例:
-- 创建表 m_db=# CREATE TABLE test_case1 (case_col1 INT); -- 插入数据 m_db=# INSERT INTO test_case1 VALUES (1), (23), (45), (1); -- case用法 m_db=# SELECT CASE WHEN case_col1 = 1 THEN 'a' ELSE 'b' END FROM test_case1; case ------ a b b a (4 rows) m_db=# SELECT CASE case_col1 WHEN 1 THEN 'a' ELSE 'b' END FROM test_case1; case ------ a b b a (4 rows) -- 删除表 m_db=# DROP TABLE test_case1;