首页 > 解决方案 > KDB:如何使用列表搜索表

问题描述

我有下表 t:

t:([]sym:3#`ibm;time:10:01:01 10:01:04 10:01:08;price:100 101 105;val:("hello";"world";"test"))

如何执行以下查询:

select from t where val in ("hello"; "test")

其中我期待以下结果:

sym time        price val
---------------------------
ibm 10:01:01    100   hello
ibm 10:01:08    105   test

标签: kdb

解决方案


看起来您的查询确实返回了您需要的结果。

或者,可以使用关键字“喜欢”。

当我们在 select 语句的末尾使用 where 子句时,“where”部分需要一个布尔值来告诉它是否应该选择列。

当我们这样做时where val in "hello",它实际上会为它匹配的字符串的每个元素返回一个布尔值(当它没有被包装时):

q)val:"hello"
q)val in "hello"
11111b

因此,要获得返回的单个布尔值,我们使用关键字like

q)val like "hello"
1b

此外,当将字符串列表传递给 where 子句时,应使用“每个正确”副词来指示 where 子句对列表的每个实例进行操作。

q)val like/: ("hello";"test")
10b

但是,当 where 子句需要单个布尔值时,我们再次面临多个布尔值

因此,当出现hellotest时,我们使用关键字any返回结果。

q)any val like/: ("hello";"test")
1b

我们可以看到,这给出了所需的结果

q)select from t where any val like/: ("hello";"test")
sym time     price val
--------------------------
ibm 10:01:01 100   "hello"
ibm 10:01:08 105   "test"

希望这可以帮助


推荐阅读