transform是将一列中的特定的值,转换成另一个值;
有两种使用方式:
1. transform(x, array_from, array_to, default)
x – 要转换的值。
array_from – 用于转换的常量数组。
array_to – 将’from’中的值转换为的常量数组。
default – 如果’x’不等于’from’中的任何值,则默认转换的值。
array_from 和 array_to – 拥有相同大小的数组。
类型约束:
transform(T, Array(T), Array(U), U) -> U
T和U可以是String,Date,DateTime或任意数值类型的。
对于相同的字母(T或U),如果数值类型,那么它们不可不完全匹配的,只需要具备共同的类型即可。
例如,第一个参数是Int64类型,第二个参数是Array(UInt16)类型。
如果’x’值等于’array_from’数组中的一个元素,它将从’array_to’数组返回一个对应的元素(下标相同)。否则,它返
回’default’。如果’array_from’匹配到了多个元素,则返回第一个匹配的元素
SELECT transform(SearchEngineID, [2, 3], ['Yandex', 'Google'], 'Other') AS title, count() AS c FROM test.hits WHERE SearchEngineID != 0 GROUP BY title ORDER BY c DESC
┌─title─────┬──────c─┐ │ Yandex │ 498635 │ │ Google │ 229872 │ │ Other │ 104472 │ └───────────┴────────┘
1.transform(x,array_from
, array_to)
与第一种不同在于省略了’default’参数。
如果’x’值等于’array_from’数组中的一个元素,它将从’array_to’数组返回相应的元素(下标相同)。 否则,它返回’x’。
类型约束:
transform(T, Array(T), Array(T)) -> T
SELECT transform(domain(Referer), ['yandex.ru', 'google.ru', 'vk.com'], ['www.yandex', 'example.com']) AS s, count() AS c FROM test.hits GROUP BY domain(Referer) ORDER BY count() DESC LIMIT 10
┌─s──────────────┬───────c─┐ │ │ 2906259 │ │ www.yandex │ 867767 │ │ ███████.ru │ 313599 │ │ mail.yandex.ru │ 107147 │ │ ██████.ru │ 100355 │ │ █████████.ru │ 65040 │ │ news.yandex.ru │ 64515 │ │ ██████.net │ 59141 │ │ example.com │ 57316 │ └────────────────┴─────────┘