ClickHouse 在 SELECT 中使用修饰符 (modifiers)

223 阅读1分钟

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)─┐
│    22018347 │
└────────┴────────┴────────┘
  • EXCEPT
SELECT * EXCEPT (i) from columns_transformers;

┌──j─┬───k─┐
│ 10324 │
│  823 │
└────┴─────┘
  • REPLACE
SELECT * REPLACE(i + 1 AS i) from columns_transformers;

┌───i─┬──j─┬───k─┐
│ 10110324 │
│ 121823 │
└─────┴────┴─────┘

应用场景

搭配 insert into 进行数据迁移

场景描述:

有表 a 与表 b,需要将表 a 的数据导入到表 b 中,有如下两个需求:

  1. 需要将表 a 的 i 列数据 +1 后再导入表 b
  2. 表 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