在 select 查询中使用修饰符 APPLY、EXCEPT、REPLACE。修饰符可以组合使用
修饰符:
APPLY:在 select 查询中对每一行使用函数EXCEPT: 在 select 查询中排除特定的列REPLACE:在 select 查询中将特定列的值替换
语法
-- APPLY
SELECT <expr> APPLY( <func> ) FROM [db.]table_name
-- EXCEPT
SELECT <expr> EXCEPT ( col_name1 [, col_name2, col_name3, ...] ) FROM [db.]table_name
-- REPLACE
SELECT <expr> REPLACE( <expr> AS col_name) from [db.]table_name
示例
- 插入数据
CREATE TABLE columns_transformers (i Int64, j Int16, k Int64) ENGINE = MergeTree ORDER by (i);
INSERT INTO columns_transformers VALUES (100, 10, 324), (120, 8, 23);
APPLY
SELECT * APPLY(sum) FROM columns_transformers;
┌─sum(i)─┬─sum(j)─┬─sum(k)─┐
│ 220 │ 18 │ 347 │
└────────┴────────┴────────┘
EXCEPT
SELECT * EXCEPT (i) from columns_transformers;
┌──j─┬───k─┐
│ 10 │ 324 │
│ 8 │ 23 │
└────┴─────┘
REPLACE
SELECT * REPLACE(i + 1 AS i) from columns_transformers;
┌───i─┬──j─┬───k─┐
│ 101 │ 10 │ 324 │
│ 121 │ 8 │ 23 │
└─────┴────┴─────┘
应用场景
搭配 insert into 进行数据迁移
场景描述:
有表 a 与表 b,需要将表 a 的数据导入到表 b 中,有如下两个需求:
- 需要将表 a 的 i 列数据 +1 后再导入表 b
- 表 a 的 j 列不在表 b 中,导入表 b 的过程中需忽略
分析:
- 使用
REPLACE可以满足需求 1 - 使用
EXCEPT可以满足需求 2
实现:
INSERT INTO db.table_b
SELECT * REPLACE(i + 1 AS i) EXCEPT(j)
FROM db.table_a