Skip to main content
动态列选择 是 ClickHouse 一项强大但尚未得到充分利用的功能。它允许你使用正则表达式选择列,而无需逐一指定每个列名。你还可以使用 APPLY 修饰符对匹配的列应用函数,这使它在数据分析和转换任务中特别实用。 我们将借助 New York taxis 数据集 学习如何使用这一功能。你也可以在 ClickHouse SQL playground 中找到该数据集。

选择匹配某个模式的列

先来看一个常见场景:从 NYC taxi 数据集中只选出包含 _amount 的列。无需手动输入每个列名,我们可以使用 COLUMNS 表达式结合正则表达式来实现:
在 SQL playground 中试用此查询
此查询返回前 10 行,但仅返回名称与模式 .*_amount 匹配的列 (即任意字符后跟 “_amount”) 。
假设我们还想返回包含 feetax 的列。 我们可以更新正则表达式,把它们也包含进来:
在 SQL playground 中尝试此查询

选择多个匹配模式

我们可以在一次查询中组合多个列匹配模式:
在 SQL playground 中试用此查询

对所有列应用函数

我们也可以使用 APPLY 修饰符,对每一列应用函数。 例如,如果我们想找出这些列各自的最大值,可以运行以下查询:
在 SQL playground 中试用此查询
或者,我们也可以改为查看平均值:
在 SQL playground 中试试这个查询
这些值有很多位小数,不过好在我们可以通过串联函数来解决这个问题。在这里,我们先应用 avg 函数,再应用 round 函数:
在 SQL playground 中试试这个查询
但这样会把平均值四舍五入为整数。如果我们想将其四舍五入到比如 2 位小数,也同样可以。除了接受函数外,APPLY 修饰符还接受 lambda,这让我们可以灵活地让 round 函数将平均值四舍五入到 2 位小数:
在 SQL playground 中试运行此查询

替换列

到目前为止都没问题。不过,假设我们想调整其中一个值,同时保持其他值不变。例如,我们可能想将总金额翻倍,并将 MTA 税除以 1.1。我们可以使用 REPLACE 修饰符来实现:它会替换某一列,同时保持其他列不变。
在 SQL playground 中试试此查询

排除列

我们也可以使用 EXCEPT 修饰符来排除某一列。例如,要去掉 tolls_amount 列,可以编写如下查询:
在 SQL playground 中试运行此查询
最后修改于 2026年7月3日