числе колонки:
text - строка (~100..150 символов)
arr_included - массив строк (~0..3 коротких строк)
arr_excluded - массив строк (~0..3 коротких строк)
Нужно отфильтровать только те строки, для которых в text встречаются все строки из arr_included и ни одной из arr_excluded. Если arr_included пустой, то text подходит, если это не противоречит условию по arr_excluded. Аналогично, если arr_excluded пустой, то text подходит, если это не противоречит условию по arr_included.
Так работает:
where
(
arrayAll(elem -> toUInt8(positionCaseInsensitive(text, elem)), arr_included)
and not arrayExists(elem -> toUInt8(positionCaseInsensitive(text, elem)), arr_excluded)
)Но не получается сделать, чтобы работало, если у нас в массивах arr_included и arr_excluded будут не просто подстроки, а подстановки для соответствия по like или регулярки.
Функции like(), match(), multiMatch*() жалуются, что хотят константный аргумент :-(. Как это можно обойти?
v19.14
никак это не решаемо.
Звучит не очень обнадеживающе:) Спасибо, будем решать по-другому
в смысле в КХ это не сделать, like не умеет не константы, потому что like применяется в блоку строк сразу, т.е. ищем среди значений 65тыс строк подстроку, если находим, начинаем блок строк разбирать на строки
Обсуждают сегодня