如何将字典传递给查询约束?

时间:2016-05-15 20:08:16

标签: kdb

如果这是约束字典:

dictName:`region`Code;
dictValue:(`NJ`NY;`EEE213);
dict:dictName!dictValue;

我想将dict传递给一个函数,并根据有多少个键,让查询做出相应的反应。如果有一个关键区域,那么我想把它作为

select from table where region in dict`region;

同样的事情是代码。但是,如果我传递两个键,我希望查询知道并将其传递为:

select form table where region in dict`region,Code in dict`code;

有没有办法做到这一点?

我提出了这段代码:

 funcForOne:{[constraint]?[`bce;enlist(in;constraint;(`dict;enlist constraint));0b;()]};

funcForAll[]
{[dict]$[(null dict)~1;select from bce;($[(count key dict)=1;($[`region in (key dict);funcForOne[`region];funcForOne[`Code]]);select from bce where region  in dict`region,rxmCode in dict`Code])]};

适用于一个和两个约束。但是当我打电话给funcForAll[]时,它会给出类型错误。我该怎么改变它?我认为它来自null dict~1 我也试过了。但效果不好。

更新

所以我这样做但是我有一些错误

    tab:([]code:`B90056`B90057`B90058`B90059;region:`CA`NY`NJ`CA);                                                                                             
dictKey:`region`Code;dictValue:(`NJ`NY;`B90057);
dict:dictKey!dictValue;
?[tab;f dict;0b;()]; 

我得到'NY错误。你知道为什么吗?另外,如果我传递一个空字典,它似乎不起作用。

2 个答案:

答案 0 :(得分:0)

如果您只是使用in,则可以执行以下操作:

f:{{[x;y](in),'key[y],'(),x}[;x]enlist each value[x]}

那样:

q)d
a| 10 1
b| ,`a
q)f d
in `a 10 1
in `b ,`a

q)t
a b c
------
1 a 10
2 b 20
3 c 30
q)?[t;f d;0b;()]
a b c
------
1 a 10

请注意,由于enlist each生成的列表已登记,因此单身人士也可以使用:

q)d:enlist[`a]!enlist 1
q)d
a| 1
q)?[t;f d;0b;()]
a b c
------
1 a 10

更新为次要问题

这仍适用于空字典,即()!()。我正在传递字典变量。

在你的第二个问题中,你的字典构造不正确(还记得q是区分大小写的)。您的价值也需要入伍。在kx站点的参考页面中查找功能选择,您将看到需要登记符号列表以区别于列名声明

`region`code!(enlist `NY`NJ;enlist `B90057)

答案 1 :(得分:0)

正如我所说,功能形式是更好的方法,但如果您的要求非常有限,那么您可以考虑以下其他解决方案:

注意:假设所有字典键都在表列列表中。

Template.unitMapView.onCreated(function() {
GoogleMaps.load({ v: "3", libraries: "geometry, places"});
});

<强>说明: 1.根据值类型将dict转换为表。翻转,如果任何值是其他登记的一般列表。

q) f:{[dict] if[0=count dict;:select from t]; 
   select from t where (#[key dict;t]) in {$[any 0<=type each value x;flip ;enlist ]x}[dict] }
  1. 获取表t的子集,其中只包含字典键作为列。

                $[any 0<=type each value dict;flip ;enlist ]dict
    
  2. 获取(1)

  3. 中的行(2)

    基本上我们使用以下形式的查询和匹配:

           #[key dict;t]