更新时间:2025-09-11 GMT+08:00
分享

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; 

相关文档