如果这是约束字典:
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错误。你知道为什么吗?另外,如果我传递一个空字典,它似乎不起作用。
答案 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] }
获取表t的子集,其中只包含字典键作为列。
$[any 0<=type each value dict;flip ;enlist ]dict
获取(1)
基本上我们使用以下形式的查询和匹配:
#[key dict;t]