счёт перевода его из строки в UInt64.
Функция перевода в число выглядит более менее прилично:
create function mac_to_UInt64 AS (m) -> reinterpretAsUInt64(reverse(unhex(replace(m, '-', ''))));
А вот обратная функция у меня получилась страшненькая:
create function UInt64_to_mac AS (i) -> lower(format('{0}-{1}-{2}-{3}-{4}-{5}', mid(leftPad(hex(i), 12, '0'), 1,2), mid(leftPad(hex(i), 12, '0'), 3,2), mid(leftPad(hex(i), 12, '0'), 5,2),
mid(leftPad(hex(i), 12, '0'), 7,2), mid(leftPad(hex(i), 12, '0'), 9,2), mid(leftPad(hex(i), 12, '0'), 11,2)));
Может кто подскажет как из неё убрать вот эти бесконечные повторы одного кода?
Или может задача вообще имеет готовое решение?
вынести повторы mid(leftpad в отдельную функцию? но это не сильно сократит код в целом итак нормально IMHO
меня не так смущает длина текста функции, как её очевидная неоптимальность - очень хочется сначала посчитать leftPad(hex(i), 12, '0'), а потом использовать его 6 раз :) интересно, clickhouse сам осилит такую оптимизацию?
ну можно наверное какой то конвейрер реализовать через arrayMap подавать в него массив таплов потом x.1 x.2 x.3 x.4 как параметры в leftpad и mid передавать
with '90:e:b3:1:bb:d6' as m, reinterpretAsUInt64(reverse(unhex(replace(m, '-', '')))) as h, (extractAllGroupsVertical(hex(h),'(..)(..)(..)(..)(..)(..)(..)(..)')[1]) as a select arrayStringConcat(a,'-');
┌─MACStringToNum('62:fb:d4:4c:3d:54')─┐ │ 108833738079572 │ └─────────────────────────────────────┘
Обсуждают сегодня