【问题标题】:LIKE operator two columns clickhouseLIKE 运算符两列 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 语句添加了通配符。

标签: sql where-clause sql-like clickhouse


【解决方案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 并假设它指的是字符位置,但是它也可以是字节 - 我无法在文档中找到此信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 2020-10-26
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2022-12-16
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多