我想在clickhouse表中选择行,其中两个字符串列彼此相似(foe example where column1 is 'Hello' and column2 is '%llo'
(
我试过LIKE操作符:
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'.
第二个自变量似乎应该是一个常数值。有其他方法可以应用这个条件吗?
CH-Like只支持常量参数。没有通用的解决方案。regex函数等也有同样的问题。(因为Clickhouse应用已编译的表达式,并在分隔成行之前应用于列字节流(。
在某些情况下,您可以为此任务使用position
或countSubstrings
函数。
您可以使用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
,并假设它指的是字符位置,但它也可以是字节——我在文档中找不到这些信息。