select 来自带有通配符,在 Q KDB 中

select from with wildcard, in Q KDB

我将 KDB 与允许我设置查询的工具一起使用。使用此工具,只能通过用户交互更改参数(过滤器值),而不能更改查询的结构。 我需要对用户操作进行 运行 查询。默认情况下,我希望它每行 select,在他 select 之后,我希望查询按他的 selection.

过滤

例如: 默认: select 来自引号 where symbol = *

用户选择符号后: select 来自 quote where symbol = `AAPL

但是,默认示例不起作用,因为与 SQL 不同,KDB 中没有 * 通配符。那么我怎样才能默认获取所有行呢?

不确定您要在此实现的确切目标或您的确切限制是什么。

如果您说等号 (=) 是固定的,那么您只能 select 一个符号....但您想要 return 所有行?从技术上讲,这可以在 select 语句中完成,例如

select from table where symbol=symbol

但如果您的 "tool" 需要输入符号类型,这可能不起作用。

要使用通配符,您需要 "like" 而不是等于,但听起来您无法控制它。

出于某种原因,您是否考虑过此工具被设计为仅允许一个符号过滤器?也许 returning 所有行的数据太多,也许太慢,也许会占用太多内存。感觉就像你在尝试破解一条捷径

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

实现您的要求的一种方法是对所有符号 select(如果用户未指定过滤器或对用户定义的子集指定 select。)您可以实施这个喜欢;

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)