使用like搜索多个字符串

时间:2018-05-15 18:55:07

标签: kdb

如何使用like搜索多个字符串?

q)\l sp.q

q)select from p where city like "lon*"
p | name  color weight city
--| -------------------------
p1| nut   red   12     london
p4| screw red   14     london
p6| cog   red   19     london

我想搜索city,以“lon”或“par”开头,/:给出type错误。

q)select from p where city like/: ("lon*";"par*")
'type

3 个答案:

答案 0 :(得分:3)

搜索多个字符串时,您需要使用any

q)select from p where any city like/: ("lon*";"par*")

p | name  color weight city
--| -------------------------
p1| nut   red   12     london
p2| bolt  green 17     paris
p4| screw red   14     london
p5| cam   blue  12     paris
p6| cog   red   19     london

当您使用/:(每个右侧)搜索时,它会返回2个向量,一个针对“lon *”搜索,另一个针对“par *”。

(0!p)[`city] like/: ("lon*";"par*")
(100101b;010010b)

使用any执行ORing并返回单个向量。

any (0!p)[`city] like/: ("lon*";"par*")
110111b

现在得到最终结果:

(0!p) where any (0!p)[`city] like/: ("lon*";"par*")
p  name  color weight city
----------------------------
p1 nut   red   12     london
p2 bolt  green 17     paris
p4 screw red   14     london
p5 cam   blue  12     paris
p6 cog   red   19     london

答案 1 :(得分:2)

正如其他人所说,将anyeach-right一起使用是最好的方法,也是最清晰的。

替代方案(在某些情况下可能有用,对于大型向量可能稍微有效)涉及使用内置的正则表达式功能,如下所示:

q)city:`london`london`newyork`paris
q)city like "[lp][oa][nr]*"
1101b

这里需要注意的是,它还会选择"lan*""lar*""por*""pan*",但如果知道这些组合是不可能的,那么它是可行的。

答案 2 :(得分:1)

您需要在where子句中添加any。现在,您的where子句正在解析为2个列表

q)city:`london`london`newyork`paris
q)city like/: ("lon*";"par*")
1100b
0001b
q)any city like/: ("lon*";"par*")
1101b

所以...

select from p where any city like/: ("lon*";"par*")