2017-10-19 10 views
2

カラムが存在する場合(エラーを避けるために)where句が適用されるように、機能選択をKDBに書き込む方法を探しています。列が存在しない場合は、デフォルトでtrueになります。KDBカラムが存在する場合にのみフレーズを適用します。

私はこれを試してみましたが、それは

enlist(|;enlist(in;`colname;key flip table);enlist(in;`colname;filteredValues[`colname])); 

を動作しませんでした私は、単純なブール式を書いて、私の関数形式

(table[`colname] in values)|(not `colname in key flip table) 

を取得するには、構文解析を使用しようとしたが、KDBが短くありません右側の式が真と評価されているにもかかわらず、左辺の式がまだ評価されています。これは奇妙な出力を引き起こしましたboolean$()は、すべてfalseと評価されるブール値のリストです0b

何か助けていただければ幸いです。ありがとう!

EDIT 1:私は辞書filters

cond,:(,/) {[l;k] enlist(in;k;enlist l[k])}[filters]'[a:(key filters)] 

で指定されたパラメータと条件のシリーズに参加する必要がありそれから私は、上のこのcondを渡すと、それは別のテーブルには、いくつかの異なった選択で実行されます。どのような条件式をenlist(in;k;enlist l[k]の代わりに入れても、select文が実行されると評価されるだけです。

答えて

1

あなたは、たとえば、あなたが望むものを

を行うために、ここでのif-else条件付き$を使用することができます。

q)$[`bid in cols`quotes;enlist (>;`bid;35);()] 
> `bid 35 
q)$[`bad in cols`quotes;enlist (>;`bad;35);()] 

注意を第二の例では、戻り値がこのカラムとして、空のリストであることだから、あなたがそうのような選択機能にこれを置くことができ、引用符テーブル

ではありません。

?[`quotes;$[`bid in cols`quotes;enlist (>;`bid;35);()];0b;()] 

および句は、カラムはそういない句が適用される場合には、存在して適用されます。

q)count ?[`quotes;$[`bid in cols`quotes;enlist (>;`bid;35);()];0b;()] 
541 //where clause applied, table filtered 
q)count ?[`quotes;$[`bad in cols`quotes;enlist (>;`bad;35);()];0b;()] 
1000 //where clause not applied, full table returned 

希望これは

ジョナサン

AquaQ解析


を支援編集:あなたの更新された質問を正しく理解している場合は、次のような何かをすることができるかもしれません。まず、フィルタ辞書の例を定義しましょう:

ここでは、説明のためにさまざまな種類のいくつかの異なる列を想定しています。 - あなたはまた、値が入隊している、そのISN

q)(in),'flip (key filters;value filters) 
in `a 1 2 3 
in `b "abc" 
in `c `d`e`f 

(これはあなたが指揮を生成しなければならなかったのコードと同等ですが、それは少しすっきり&、より効率的です:あなたはどこので、のような句のあなたのリストを構築することができます

次に、vector conditionalを使用して、特定のテーブルに適用するwhere句のリストを生成できます。

q)t:([] a:1 2 3 4 5 6;b:"adcghf") 
q)?[key[filters] in cols[t];(in),'flip (key filters;value filters);count[filters]#()] 
(in;`a;,1 2 3) 
(in;`b;,"abc") 
() 

この例では、テーブル「t」には列aとbがありますが、cはありません。したがって、条件付きのベクトルを使用すると、aとbではwhere節が得られますが、cではありません。ここで注意すべき

q)l:?[key[filters] in cols[t];(in),'flip (key filters;value filters);count[filters]#()] 
q){?[x;$[y~();y;enlist y];0b;()]}/[t;l] 
a b 
--- 
1 a 
3 c 

ことの一つは、ことはのWHERE句である。最後に、実際にテーブルに句、あなたが順番にそれぞれを適用するoverを利用することができ、出力のこのリストを適用する

私たちは、yが空のリストがあるかどうかを確認する必要があり、機能選択 - これはあなたのコードは私のために仕事をし、それが空のリストこれは

+0

おかげで多くのことができます

希望がない場合ので、我々はそれを参加することができます。しかし、私の問題には別の部分があります。私の編集と助言を見てください。もう一度ありがとう – KeenSeeker99

+1

遅延の申し訳ありませんが、うまくいけばあなたの質問の第二部分に対処するための拡張答えを追加して、それが助けて欲しい! –

関連する問題