问题描述
喜欢 Clickhouse 中的数组!
目前,我们正在尝试设计一个解决方案,要求我们找出 array1 中的元素是否存在于 array2 中,而不管顺序。
例如
array1= ['x','y','z']
array2= ['a','x','c']
Then the return that we want is [1,0]
- 是否有一种简单的开箱即用的方法来实现这一点?
- 这是一个更大查询的一部分,这意味着该数组比较的结果将用作 arrayMap((a,b) -> a*b,result,metric_array) 的一部分——更多的是内联过滤。
- 如果有任何方法可以做到这一点,性能将大大提高!
提前致谢!
解决方法
https://www.google.com.hk/amp/s/clickhouse.tech/docs/en/sql-reference/functions/array-functions/amp/
操作应该是
has(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','z'] │ ['a','c'] │ [1,0] │
└───────────────┴───────────────┴─────────┘
*/
这个解决方案看起来无效,但也可以检查一下:
SELECT
['x',arrayIntersect(a1,a2) AS a3,arrayMap(x -> has(a3,a1) AS result
/*
┌─a1────────────┬─a2────────────┬─a3────┬─result──┐
│ ['x','c'] │ ['x'] │ [1,0] │
└───────────────┴───────────────┴───────┴─────────┘
*/
,
有点复杂,但肯定有效!
WITH
['x','z'] AS i,'c'] AS j
SELECT arraySlice(arrayMap(m -> (m - 1),arrayEnumerateUniq(arrayConcat(j,i))),length(j) + 1) AS final
分步形式
WITH
['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