в WHERE?
Табличка:
create table t (a Array(UInt64)) engine Memory();
Добавляем 3 записи:
insert into t (a) values ([]), ([1,2,5]), ([4]);
Вроде бы банальный запрос должен работать, но нет. Ошибка:
select length(a) from t where length(a);
А вот эти два запроса проходят без проблем:
select length(a) from t where 1;
select length(a) from t where length(a) > 0;
Так и должно быть?
Потому что логическое значение может быть 1 или 0
Но и такой запрос выполняется без проблем: select length(a) from t where 10; То есть в WHERE может быть любое выражение, которое можно привести к UInt8. Проверяем: select length(a) from t where cast(length(a), 'UInt8'); То есть результат функции без проблем приводится к этому типу. Почему же CH ругается на запрос без явного приведения типа?
Потому что булевый тип в uInt8, и скорей всего стоит проверка на тип данных
Может потому что есть невлезающее значение, может потому что функция имеет результат конкретного типа. Мне интересно, как появляется мысль написать такое условие😊
Разобрался. CH не хочет автоматически приводить типы, а потому воспринимает либо число не более 255, либо нужно явно приводить к типу, либо использовать операцию сравнения.
Функция возвращает UInt64, а CH не хочет сам приводить результат к UInt8. При этом непосредственные результаты могут быть менее 256, хотя и с типом UInt64. Но вообще не совсем логично (на мой взгляд). Ведь cast легко преобразовывает любое число к UInt8. Да мысль была самая простая. Писал условие по аналогии с MySQL, который без проблем подобные условия обрабатывает. То есть подразумевалось, если количество элементов массива больше 0, то запись попадает в выборку, если нет, то не попадает. В итоге можно, конечно, применить и функцию empty. Но осадочек остался... :)
Обсуждают сегодня