#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
выше и предполагаю, что он относится к позиции символа, но это также может быть байт — я не смог найти эту информацию в документах .