【发布时间】:2016-05-15 20:08:15
【问题描述】:
如果这是约束字典:
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 错误。你知道为什么吗?另外,如果我传递一个空字典,它似乎不起作用。
【问题讨论】:
-
检查选择的功能形式。每当有动态查询创建案例时,功能形式就是这样做的方法。
-
谢谢拉胡尔。我正在考虑这样做。但是我怎样才能只用一个键或两个键将字典传递给它呢?谢谢
-
我尝试编写一个函数,它可能适用于一两个约束。但是当它没有通过任何东西时,就会出现类型错误。我如何编写一个不传递任何内容、一个约束、两个约束的函数?
标签: kdb