КАК оператор две колонки clickhouse

#sql #where-clause #sql-like #clickhouse

Вопрос:

Я хочу выбрать строки в таблице clickhouse, где два строковых столбца похожи друг на друга ( foe example where column1 is 'Hello' and column2 is '%llo' )

Я пытался, КАК оператор:

 SELECT * FROM table_name WHERE column1 LIKE column2;
 

но там было написано:

 Received exception from server (version 21.2.8):
Code: 44. DB::Exception: Received from localhost:9000. DB::Exception: Argument at index 1 for function like must be constant: while executing 'FUNCTION like(column1 : 17, column2 : 17) -> like(column1, column2) UInt8 : 28'. 
 

похоже, что вторым аргументом должно быть постоянное значение. Есть ли какой-либо другой способ применить это условие?

Комментарии:

1. Я сделал это в MSSQL следующим образом: например, » % » столбец 2 «%», это добавляет подстановочный знак для оператора like.

Ответ №1:

CH Like поддерживает только постоянный аргумент. Общего решения не существует. Та же проблема с функциями регулярных выражений и так далее. (поскольку Clickhouse применяет скомпилированное выражение и применяется к потоку байтов столбцов перед разделением на строки).

В некоторых случаях вы можете использовать position countSubstrings функции или для этой задачи.

Ответ №2:

Вы можете использовать LOCATE или POSITION для этого (https://clickhouse.tech/docs/en/sql-reference/functions/string-search-functions/). Запрос будет выглядеть примерно так:

 SELECT *
FROM table_name
WHERE position(column1, column2, character_length(column1) - character_length(column2)   1) > 0;
 

Это может быть ошибочным. Похоже, что в clickhouse большинство строковых функций работают с байтами или переменной длиной UTF8 байтов, а не с символами. Необходимо обратить внимание, следовательно, на то, как работают функции и как они должны быть объединены. Я использую третий параметр start_pos выше и предполагаю, что он относится к позиции символа, но это также может быть байт — я не смог найти эту информацию в документах .