当编写 SQL 时,有时可能希望将相同的函数应用于多个列,这通常需要重复代码并且必须列出所有列,例如:
SELECT
*,
formatReadableSize(read_bytes) AS read_bytes_readable,
formatReadableSize(written_bytes) AS written_bytes_readable,
formatReadableSize(result_bytes) AS result_bytes_readable
FROM system.query_log
WHERE query_id = '56c3c260-34bc-4e35-88e7-07d50a04e8f9'
这会导致查询语句非常长且难以维护,尤其是随着查询大小的增长。此时可以使用SELECT ... EXCEPT
语法,例如SELECT * EXCEPT (read_bytes, written_bytes, result_bytes)
。这个语法允许从结果中删除提供的列子集。还可以使用COLUMNS
表达式来选择列名中公共包含的字符串,例如 COLUMNS('bytes')
将匹配到read_bytes
、written_bytes
和result_bytes
这三列,类似like的用法,最后使用APPLY
修饰符将函数应用于先前选择的每个列,例如APPLY formatReadableSize
。
完整的查询如下所示:
SELECT
* EXCEPT (read_bytes, written_bytes, result_bytes),
COLUMNS('bytes') APPLY formatReadableSize
FROM system.query_log
WHERE query_id = '56c3c260-34bc-4e35-88e7-07d50a04e8f9'
此 SQL等价于第一个 SQL。