LIKE 运算符两列 clickhouse
Posted
技术标签:
【中文标题】LIKE 运算符两列 clickhouse【英文标题】:LIKE operator two columns clickhouse 【发布时间】:2021-06-03 13:58:34 【问题描述】:我想在 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'.
看来第二个参数应该是一个常数值。有没有其他方法可以应用这个条件?
【问题讨论】:
我在 MSSQL 中是这样完成的: Like '%' + column2 + '%' 这为 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
并假设它指的是字符位置,但是它也可以是字节 - 我无法在文档中找到此信息。
【讨论】:
以上是关于LIKE 运算符两列 clickhouse的主要内容,如果未能解决你的问题,请参考以下文章
两列之间带有 Like 的 CriteriaBuilder 查询