2013-05-29 1 views
3

J'ai trouvé un problème étrange dans q, un bug possible je suppose. J'ai défini une fonction simple qui retourne un flotteur, donné une date d'entrée:Différence dans le comportement de la fonction lorsqu'elle est appelée de manière autonome ou à l'intérieur d'une requête dans q

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

Il fonctionne sans problème si elle est appelée autonome:

q)give_dummy[2013.05.10] 
0.001 

Néanmoins, si je tente de l'appeler dans une requête que je reçois une erreur:

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

Si je simplifie la fonction de revenir juste la date d'entrée (fonction d'identité), cela fonctionne dans la requête. Si je simplifie la fonction de retourner simplement un flottant, sans comparer les dates, cela fonctionne dans la requête. Le problème se pose lorsque j'utilise la date d'entrée pour la comparer dans l'instruction if: $ [the_date> 2013.01.01; 0,001; 0,002]

La même chose se produit si je Redéfinir la fonction prenant un flotteur en entrée, au lieu d'une date, puis je tente de donner le prix en entrée dans la requête:

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 

-vous avoir une idée de pourquoi cela arrive? J'ai tout essayé. Merci Marco

+0

J'ajoute que si j'essaie d'insérer une instruction if triviale dans une requête, l'ID ne fonctionne pas: select ($ [1> 0; 1; 0]), date , prix, volume de l'onglet où sym = sec 'rank –

+0

Si j'utilise l'instruction? [;;], au lieu de $ [;;]. Cela fonctionne .. O_o –

Répondre

4

Vous devez soit:

select give_dummy each date from tab where ... 

Ou:

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

? est le vecteur conditionnel. Voir ici pour plus de détails: http://code.kx.com/q4m3/10_Execution_Control/

+0

Merci! Je l'avais déjà découvert avec le? Ça marche. Donc la conclusion est que je dois considérer chaque colonne sélectionnée dans une requête comme un vecteur, quand je l'utilise dans une fonction, et non la fonction comme agissant sur des entrées simples .. Je vais garder à l'esprit –

+0

Il n'y a pas besoin de ':' Vous pourriez avoir la fonction soit 'give_dummy: {[the_date]? [the_date> 2013.01.01; 0.001; 0.002]}' tant que vous omettez le dernier ';', qui supprime le sortie En note, les colonnes ne doivent pas être considérées comme des vecteurs, ce sont des vecteurs. Il est clair de voir lors de la définition d'une table '([] c1:' a'b'c; c2: 1 2 3) 'c1 et c2 sont tous deux des vecteurs simples (l'un des symboles et l'autre des entiers). Intérioriser cela rendra la vie beaucoup plus facile et votre code beaucoup plus clair. – JPC

Questions connexes