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 应用编译后的表达式并在分离到行之前应用到列字节流)。

在某些情况下,您可以为此任务使用 positioncountSubstrings 函数。

【讨论】:

【参考方案2】:

您可以为此使用LOCATEPOSITION (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?

两列之间带有 Like 的 CriteriaBuilder 查询

LIKE运算符

如何优化 Impala 查询以将 LIKE 与 IN 结合(字面意思或有效)?

SQL学习——LIKE运算符

Oracle Like(模式匹配)子句