根据kdb

时间:2018-01-15 11:29:39

标签: kdb q-lang

我有一个名为'A'的列表:

     cont
     "aa"
     "bb"
      "cc"

我有一个名为'run'的表,其中包含列

      first    second     third
      sad      random      "aa"
      happy    random1     "dd"

我必须从'run'中选择那些行,其中第三列包含列表A中的元素。我对kdb很新,并且对如何执行此操作的任何帮助表示赞赏。感谢

1 个答案:

答案 0 :(得分:2)

您需要使用关键字in,以便检查一个列表中的值是否显示在另一个列表中:

q)show A:("aa";"bb";"cc")
"aa"
"bb"
"cc"
q)show run:([]f:("sad";"happy");s:("random";"random1");t:("aa";"dd"))
f       s         t
----------------------
"sad"   "random"  "aa"
"happy" "random1" "dd"
q)select from run where t in A
f     s        t
-------------------
"sad" "random" "aa"

如果A是未加密的表格,那么您可以使用cont将列A`cont拉出来:

q)show A:([]cont:("aa";"bb";"cc"))
cont
----
"aa"
"bb"
"cc"
q)select from run where t in A`cont
f     s        t
-------------------
"sad" "random" "aa"

当使用in时,输出是一个布尔列表,其数量与左边的参数相等(在这种情况下为1 2 3):

q)1 2 3 in 2 4 6
010b

使用where语句中的select子句过滤返回的行。将where应用于布尔列表仅返回其为真的索引:

q)where 1 2 3 in 2 4 6
,1

通过扩展,只会从表中返回这些索引。

还应该注意,即使您提供的表只是一个示例,它也包含关键字first作为列标题。如果可能,应避免使用标题作为标题,因为它们会导致意外行为。