2016-09-20 57 views
0

我使用KDB和一个让我设置查询的工具。使用此工具,只有参数(过滤器值)可以随用户交互而改变,而不是查询的结构。 我需要一个查询在用户操作上运行。默认情况下,我希望它选择每一行,并且在他选择了某些内容之后,我希望查询按他的选择进行过滤。从通配符中选择,在Q KDB

例如: 默认: 从报价其中符号= *

用户之后选择一个符号选择: 从报价其中符号=`AAPL

但是,默认实例没有按”选择因为在KDB中没有*通配符,与SQL不同。我怎样才能默认获得所有行呢?

回答

3

不确定你想要达到什么,或者你的确切约束是什么。

如果你说等于(=)是固定的,那么你只能选择一个符号....但是你想要返回所有的行吗?从技术上讲这可以在一个select语句来完成,像这样

select from table where symbol=symbol 

但如果你的“工具”期待型符号的输入,这可能无法正常工作。

要使用通配符,您需要“like”而不是equals,但听起来好像无法控制它。

你认为这个工具的设计只允许一个符号过滤器有一个原因?也许返回所有的行将会是太多的数据,也许它会太慢,也许它会占用太多的内存。感觉就像你试图破解一个快捷方式

+0

谢谢您的回答。我可以控制“喜欢”而不是平等。那么通配符是什么? – MarinD

+0

从t中选择符号,如“?*” – terrylynch

+0

实际上,这不会返回空符号,这将会:从t中选择符号,如enlist“*” – terrylynch

1

你可以将有问题的列转换为字符串并使用like。

实现您的要求的一种方法是选择所有syms(如果用户没有指定过滤器或选择用户定义的子集)。

q)show myTable:update stamps:dates+'times from ([]syms:`AAPL`GOOG`PRDC`LALA`LOLO;times:5?.z.T;dates:5?.z.D) 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
PRDC 00:15:49.627 2016.05.21 2016.05.21D00:15:49.627000000 
LALA 01:30:32.099 2015.01.04 2015.01.04D01:30:32.099000000 
LOLO 00:31:19.910 2013.12.01 2013.12.01D00:31:19.910000000 
q)filter1:{[allSyms;usrSyms] symList:$[all null usrSyms;allSyms;usrSyms]; select from myTable where syms in symList}[exec distinct syms from myTable;] 
/filter1 is a projection so you don't have to query the table for all syms each time 
q)filter1`GOOG`APPL 
syms times  dates  stamps 
---------------------------------------------------------- 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)filter1`GOOG`AAPL 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)filter1` 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
PRDC 00:15:49.627 2016.05.21 2016.05.21D00:15:49.627000000 
LALA 01:30:32.099 2015.01.04 2015.01.04D01:30:32.099000000 
LOLO 00:31:19.910 2013.12.01 2013.12.01D00:31:19.910000000 
q) 

我宁愿实现类似的东西;

q)filter2:{[usrSyms] ?[myTable;$[all null usrSyms;();enlist(in;`syms;enlist usrSyms)];0b;()]} 
q)filter2` 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
PRDC 00:15:49.627 2016.05.21 2016.05.21D00:15:49.627000000 
LALA 01:30:32.099 2015.01.04 2015.01.04D01:30:32.099000000 
LOLO 00:31:19.910 2013.12.01 2013.12.01D00:31:19.910000000 
q)filter2`GOOG 
syms times  dates  stamps 
---------------------------------------------------------- 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)filter2`GOOG`AAPL 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)