大数据组件clickhouse多个like查询的坑:Argument at index 1 for function like must be constant

多个字段一起like查询的情况非常常见,而clickhouse在多个查询的时候有个坑,我们一起来看一下

  1. 首先看发送错误的SQL
    select * from http where url like ‘%sn110%’ and host like ‘%sn110%’ order by create_time_stamp DESC
    大数据组件clickhouse多个like查询的坑:Argument at index 1 for function like must be constant
    执行直接报错“Argument at index 1 for function like must be constant”

很奇怪,为什么相同的sql,在mysql数据库执行没有问题,clickhouse会爆出错误

  1. 接下来,我改变一下任意一个like的值,却能执行成功
    大数据组件clickhouse多个like查询的坑:Argument at index 1 for function like must be constant
  2. 不改变like的值,删除掉排序
    大数据组件clickhouse多个like查询的坑:Argument at index 1 for function like must be constant

最后发现这个居然跟排序又有关系

  1. 不改变like的值,改变排序的字段
    大数据组件clickhouse多个like查询的坑:Argument at index 1 for function like must be constant

最终确认,是和排序的字段有关系
排查到这里,基本可以确定,多个like时,每个like的数据一样时,排序字段只能取多个like字段中的一个

接下来就要改这个查询sql,既然一次查询多like的数据一致,必须取like字段排序的话,在不改变原有业务逻辑的情况下,采用子查询将like数据查询出来,再对结果进行排序,即:
select * from (select * from http where url like ‘%sn110%’ and host like ‘%sn110%’) a order by create_time_stamp DESC
大数据组件clickhouse多个like查询的坑:Argument at index 1 for function like must be constant