KDBQ-为列表中的每个原子应用每个剩余值并减少

KDBQ-为列表中的每个原子应用每个剩余值并减少,kdb,q-lang,Kdb,Q Lang,我想在一个表的列和列表中的每个原子之间应用每个左边的。我不能同时使用和,因为表列和列表的长度不同 我已经在某个地方看到过这一点,但我再也找不到了 例如: t:([] name:("jim";"john";"john";"julia");c1: til 4); searchNames:("jim";"john"); f:{[name;nameCol] nameCol like\:name}; / each-left between name (e.g. "jim") and column g:f[

我想在一个表的列和列表中的每个原子之间应用
每个左边的
。我不能同时使用
,因为表列和列表的长度不同

我已经在某个地方看到过这一点,但我再也找不到了

例如:

t:([] name:("jim";"john";"john";"julia");c1: til 4);
searchNames:("jim";"john");
f:{[name;nameCol] nameCol like\:name}; / each-left between name (e.g. "jim") and column
g:f[;t[`name]];
r:g each searchNames; / result: (1000b;0110b)
filter:|/[r];     / result: 1110b
select from t where filter 

我怎样才能做得更像q-like?

如果您希望在每个权限中使用
like

q)select from t where any name like/:searchNames
name   c1
---------
"jim"  0
"john" 1
"john" 2
在这种情况下,您只需在
中使用
,因为您没有使用任何通配符:

q)select from t where name in searchNames
name   c1
---------
"jim"  0
"john" 1
"john" 2

下面是一个通用函数,您可以使用两个不同大小的列表

q)f:{(|) over x like/:y}
q)
q)select from t where f[name;searchNames]
name   c1
---------
"jim"  0
"john" 1
"john" 2
或者,将其包装到单个函数中(假设始终搜索表列):

但在你描述的场景中,托马斯的解决方案似乎是最自然的

q)f2:{x where (|) over (0!x)[y] like/:z}
q)
q)f2[t;`name;searchNames]
name   c1
---------
"jim"  0
"john" 1
"john" 2