которой есть поле String с содержимом вида '1,2,3,4,5'. И есть view на эту таблицу, которая преобразует это поле в Array с помощью функции splitByRegexp. Далее я попытался воспользоваться hasAny в запросе для view у получил ошибку
DB::Exception: There is no supertype for types String, UInt8 because some of them are String/FixedString and some of them are not: while executing 'FUNCTION hasAny(if(equals(length(n), 0), [], splitByRegexp(',\n*', n)) : 8, [1, 2] : 4) -> hasAny(if(equals(length(n), 0), [], splitByRegexp(',\n*', n)), [1, 2]) UInt8 : 9'. (NO_COMMON_TYPE)
Как бы мне решить проблему без mat. view? Спасибо.
у вас массив какого типа когда вы сделали splitByRegexp? и какой тип вы пытаетесть передать в hasAny?
1. а причем тут mat view 2. ошибка вам говорит, что вы пытаетесь сравнивать строки с числами
Тип после "чистого сплита" будет Array(String), но во view у меня тип поля Array(UInt32) и если применить toTypeName, то этот тип и есть. ┌─toTypeName(n)─┐ │ Array(UInt32) │ └───────────────┘ Однако select * from test_view where hasAny(n, [1,2]); как раи и выдает ошибку.
mat view "положит" к себе преобразованный Array(UInt32), насколько я понимаю. А вот обычный view почему то апеллирует к String
а как вы view создавали? почему там Array(UInt32) если split возвращает Array(String)?
create table test_local ( date Date, n String ) ENGINE = MergeTree() PARTITION BY toYYYYMM(date) order by date; drop table test_view create view test_view ( date Date, n Array(UInt32) ) AS SELECT date, if(length(n) = 0, [], splitByRegexp(',\n*', n)) AS n from test_local
ну приведите массив к интам явно, так конечно не будет работать
splitByRegexp(',\n*', n)::Array(UInt32)
split строки возвращает массив из строк https://fiddle.clickhouse.com/23fd4018-c027-4f58-ac4d-94459bc879b5
сплит строки возвращает массив из строк https://fiddle.clickhouse.com/c9290298-9f2c-4cf1-b78d-a1bb4e1129ff
Вот, спасибо огромное :)
Обсуждают сегодня