【问题标题】:How to create a query on ClickHouse similarly to a MySQL query that uses LIKE with JOIN?如何在 ClickHouse 上创建类似于使用 LIKE 和 JOIN 的 MySQL 查询的查询?
【发布时间】:2021-11-20 17:00:01
【问题描述】:

我知道在 ClickHouse 中,我们必须使用带有 ON conditionals 的相等运算符。有什么建议可以解决我们必须使用 LIKE 运算符的情况,同样with MySQL 做了什么?

类似:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON b.column LIKE CONCAT('%', a.column ,'%')

只是为了测试,我还尝试使用类似于first example of the JOIN documentation 的第二个条件:

SELECT course_id, usage_key , display_name  
  FROM video_events  LEFT JOIN video_info 
  ON video_events.course_id = video_info.course_key 
  AND startsWith(video_info.display_name, 'Choro');

但我得到了错误:

Code: 403. DB::Exception: Received from localhost:9000. DB::Exception: Expected equality or inequality, got 'startsWith(display_name, 'Choro')': While processing startsWith(display_name, 'Choro').

即使我有一行上面的字符串:

e19b1e00a6b6 :) select course_id, usage_key , display_name  from video_events  JOIN video_info on video_events.course_id = video_info.course_key;

┌─────course_id───────────────────────────┬─usage_key─────────────────────────────────────────────────────────────────────────────────┬─display_name───────────────┐    
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@chapter+block@379e3fbc409744d9bdaffa309dd6e20d    │ Section 1                  │
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@sequential+block@e09c8c6e1ec746d1a31b634438f42071 │ Videos             │
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@vertical+block@ac5ab25121044b1da4e9658e2d876a4b   │ Classical          │
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@video+block@ec9ba45b09e74ee98858ee40e28e31e9      │ Debussy            │
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@vertical+block@7799a7acf46d46e0a3b1b1298d6e542b   │ Brasileira         │
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@video+block@7b91e95676eb472d8f528d701c5fe929      │ Choro              │
│ course-v1:Introduction+CS001+2021autumn │ block-v1:Introduction+CS001+2021autumn+type@sequential+block@a1586de2d0ca4b31ae24cf3146e09c96 │ Forum              │
└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────┘

我想在表video_info 的上述字符串列usage_key 中从表video_idvideo_id 列中过滤一个ID(例如7799a7acf46d46e0a3b1b1298d6e542b)。

我也想过使用match 来搜索字符串,但我仍然不知道如何将它与 ON 条件一起使用。

【问题讨论】:

标签: join sql-like clickhouse


【解决方案1】:

我找到了一种方法来解决我想要的问题,方法是使用 replaceRegexpOne 函数过滤具有另一个表的 ID 的列,以便在连接两个表时可以使用相等性。

所以我得到了这样的查询:

SELECT course_id, user_id, replaceRegexpOne(usage_key, '.*(video\+block@)(.*)', '\\2') AS video_info_id, display_name 
  FROM video_info 
  INNER JOIN video_events 
  ON video_info_id = video_id ;

返回包含 course_id、user_id、video_id 和 video_display_name 列的表:

course-v1:Introduction+CS001+2021autumn 11  ec9ba45b09e74ee98858ee40e28e31e9    Debussy
course-v1:Introduction+CS001+2021autumn 11  ec9ba45b09e74ee98858ee40e28e31e9    Debussy
course-v1:Introduction+CS001+2021autumn 10  7b91e95676eb472d8f528d701c5fe929    Choro
course-v1:Introduction+CS001+2021autumn 10  7b91e95676eb472d8f528d701c5fe929    Choro

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT * 
    FROM (
      SELECT course_id, usage_key , display_name  
      FROM video_events  LEFT JOIN video_info 
        ON video_events.course_id = video_info.course_key 
      )
    WHERE startsWith(display_name, 'Choro');
    

    【讨论】:

    • 这行得通,@vladimir!谢谢。现在我必须弄清楚如何使正则表达式“Choro”在这种情况下成为表 video_event.video_id 的任何值。
    • 我可以使用我在原帖中提到的匹配功能匹配特定的视频 ID:SELECT * FROM (SELECT course_id, usage_key , display_name FROM video_events INNER JOIN video_info ON video_events.course_id = video_info.course_key) WHERE match(usage_key, '7b91e95676eb472d8f528d701c5fe929');
    • @everton137 我会考虑使用 LIKEILIKE 运算符 - select .. where display_name like '%Choro%'
    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2013-10-11
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多