如何比较两个数组并在 Clickhouse 的数组中找到匹配项 (0/1)

How to compare two arrays and find the the match (0/1) in an array in Clickhouse

喜欢 Clickhouse 中的数组!

目前,我们正在尝试设计一个解决方案,要求我们找出 array1 中的元素是否存在于 array2 中,而不考虑顺序。

例如

array1= ['x','y','z']
array2= ['a','x','c']

Then the return that we want is [1,0,0]

  1. 是否有一种简单的开箱即用的方法来完成此操作?
  2. 这是一个更大查询的一部分,这意味着该数组比较的结果将用作 arrayMap((a,b) -> a*b, result, metric_array) 的一部分 --更多的是内联过滤。
  3. 如果有任何方法可以做到这一点,性能将大大提高!

提前致谢!

https://www.google.com.hk/amp/s/clickhouse.tech/docs/en/sql-reference/functions/array-functions/amp/

操作应该是

有(arr, elem)

   SELECT has([1, 2, NULL], NULL)

试试这个查询:

SELECT
    ['x', 'y', 'z'] AS a1,
    ['a', 'x', 'c'] AS a2,
    arrayMap(x -> has(a2, x), a1) AS result

/*
┌─a1────────────┬─a2────────────┬─result──┐
│ ['x','y','z'] │ ['a','x','c'] │ [1,0,0] │
└───────────────┴───────────────┴─────────┘
*/

这个解决方案看起来无效,但也可以检查一下:

SELECT
    ['x', 'y', 'z'] AS a1,
    ['a', 'x', 'c'] AS a2,
    arrayIntersect(a1, a2) AS a3,
    arrayMap(x -> has(a3, x), a1) AS result

/*
┌─a1────────────┬─a2────────────┬─a3────┬─result──┐
│ ['x','y','z'] │ ['a','x','c'] │ ['x'] │ [1,0,0] │
└───────────────┴───────────────┴───────┴─────────┘
*/

有点费解,但确实有效!

WITH 
    ['x', 'y', 'z'] AS i, 
    ['a', 'x', 'c'] AS j
SELECT arraySlice(arrayMap(m -> (m - 1), arrayEnumerateUniq(arrayConcat(j, i))), length(j) + 1) AS final

分步形式

WITH 
    ['x', 'y', 'z'] AS i, 
    ['a', 'x', 'c'] AS j
SELECT 
    arrayConcat(j, i) AS k, 
    arrayEnumerateUniq(k) AS l, 
    arrayMap(a -> (a - 1), l) AS m, 
    arraySlice(m, length(j) + 1) AS final