我想运行该功能
{`$安全X}
在列表上
order`KDB_SEC_ID
并返回失败的值列表。我有下面的,它有效,但我想知道是否有一种更简洁的方式来写这个没有使用do循环。
示例代码:
idx:0;
fails:();
do[count (order`KDB_SEC_ID);
error:@[{`Security$x};(order`KDB_SEC_ID)[idx];0Nj];
if[error=0Nj;fails:fails,(order`KDB_SEC_ID)[idx]];
idx:idx+1;
];
missingData:select from order where KDB_SEC_ID in distinct fails;
我同意Terry的答案是最简单的方法,但这里有一个更简单的方法来做你试图帮助你看看如何在不使用do循环的情况下实现它的方法
q)SECURITY
`AAPL`GOOG`MSFT
q)order
KDB_SEC_ID val
--------------
AAPL 1
GOOG 2
AAPL 3
MSFT 4
IBM 5
q)order where @[{`SECURITY$x;0b};;1b] each order`KDB_SEC_ID
KDB_SEC_ID val
--------------
IBM 5
如果它通过则输出0b
,如果失败则输出1b
,从而产生布尔列表。在布尔列表上使用where
返回1b
出现的索引,您可以使用它来索引order
以返回失败的行。
如果你的测试要检查哪个KDB_SEC_ID
可以列举到Security
列表,你不能做
q)select from order where not KDB_SEC_ID in Security
或者我错过了什么?
要在更一般的情况下回答您的问题,您可以在列表上实现try-catch,以使用类似的方式返回失败列表
q){x where @[{upper x;0b};;1b] each x}(2;`ab;"Er";1)
2 1