2013-05-29 17 views
3

我在q中发现了一个奇怪的问题,我认为这是一个可能的错误。 我已经定义了一个简单的函数,返回一个float,给定一个日期作为输入:函数行为在独立调用或内部查询时的差异

give_dummy:{[the_date] 
    /// give_dummy[2013.05.10] // <- if u wanna test 
    :$[ the_date > 2013.01.01 ; 0.001 ; 0.002] ; 
} 

它的工作原理没有问题,如果所谓的独立:

q)give_dummy[2013.05.10] 
0.001 

不过,如果我尝试调用它在查询中我得到一个错误:

q)select give_dummy[date] from tab where sym = sec, i >= first_i , i < 4000 
'type 

如果我简化功能只返回输入日期(身份功能),它工作在查询中。 如果我简化函数返回一个浮点数,而不比较日期,它在查询中工作。 我使用输入日期在if语句中比较它时出现问题: $ [the_date> 2013.01.01; 0.001; 0.002]

同样的情况,如果我重新定义函数采取浮动作为输入,而不是比一个日期,然后我试着给的价格,查询中输入:

give_dummy:{[the_price] 
    /// give_dummy[12] // <- if u wanna test 
    :$[ the_price > 20 ; 0.001 ; 0.002] ; 
} 
q) give_dummy[12] 
0.002 
q)select give_dummy[price] from tab where sym = sec, i >= first_i , i < 4000 
'type 

你有任何想法为什么发生这种情况? 我尝试了一切。 感谢 马尔科

+0

我补充说,如果我试图插入一个简单的if语句在查询中,ID不起作用: select($ [1> 0; 1; 0]),日期,价格,音量从标签其中sym =秒 '排名 –

+0

如果我使用?[;;]语句,而不是$ [;;]之一。它的工作.. O_o –

回答

4

您需要:

select give_dummy each date from tab where ... 

或者:

give_dummy:{[the_date] :?[ the_date > 2013.01.01 ; 0.001 ; 0.002]; } 
select give_dummy[date] from tab where ... 

?是矢量条件。在这里看到更多的细节:http://code.kx.com/q4m3/10_Execution_Control/

+0

谢谢!我已经发现,与?有用。 所以结论是,我必须考虑在查询中选择的每一列作为一个向量,当我在一个函数中使用它,而不是函数作为单个条目时。 我会记住 –

+0

有没有需要''''只要你省略最后一个';',你可以只有函数 'give_dummy:{[the_date]?[the_date> 2013.01.01; 0.001; 0.002]}',否则会抑制输出 作为一个侧面说明,列不应该被视为向量,它们是向量。在定义一个表的时候可以很清楚地看到'([] c1:'a'b'c; c2:1 2 3)'c1和c2都是简单的向量(符号和整数的其中一个)。内在化这将使生活变得更容易,你的代码更加清晰。 – JPC