clickhouse.
Имеем таблицу mysql с 5 колонками. Каждая колонка содержит какое-то значение, либо null - т.е. любое
Пример данных
col1, col2, col3, col4, col5
11, null, null, null, null -- т.е. главное что бы col=11
null, 11, 11, null ,null -- т.е. col2=11 and col3=11
Так же в кликхаусе данные, с такими же 5 колонками.
Нужен какой-то запрос, который позволит наложить данные mysql на данные кликхаус.
По идее, эта задача решается запросом:
SELECT *
FROM CH.table ch
LEFT JOIN MYSQL.table m
ON
(ch.col1=m.col1 or m.col1 is NULL)
AND
(ch.col2=m.col2 or m.col2 is NULL)
AND
(ch.col3=m.col2 or m.col3 is NULL)
AND
(ch.col4=m.col2 or m.col4 is NULL)
AND
(ch.col5=m.col2 or m.col5 is NULL)
Но кликхаус версии 21.4.5.46 говорит
[2021-09-20 15:56:15] Code: 48, e.displayText() = DB::Exception: JOIN ON does not support OR. Unexpected '(m.col1 = col1) OR (m.col1 IN (NULL))': While processing (m.col1 = col1) OR (m.col1 IN (NULL)) (version 21.4.5.46 (official build))
Пробовали словарем, но получается очень страшная конструкция с перемножением всех вариантов(порядка ).
Подскажите, плиз, никто ли не сталкивался с такой проблемой и как ее средствами КХ можно решить?
следите за обновлениями https://github.com/ClickHouse/ClickHouse/pull/21320 ну вообще у вас вроде обычный dictGet запрос должен работать SELECT * , dictGetOrDefault('mysql_dict_by_col1','col1',tuple(ch.col1),NULL) AS filter1, dictGetOrDefault('mysql_dict_by_col2','col2',tuple(ch.col2),NULL) AS filter2 FROM CH.table ch WHERE (filter1 IS NOT NULL) OR (filter2 IS NOT NULL) но выглядит как то странно ... почему у вас left join ? он фактически ничего не выберет
Смотрите, в mysql может быть такие данные col1, col2 111, null 222, 333 В в клихаусе допустим col1, col2 111, 222 —- подходит под 111, null 222, 111 — не подходит, ни под 111, null, ни под 222, 333
Обсуждают сегодня