В запросе выбора задайте значение столбца на основе условия if -else if в q kdb - PullRequest
0 голосов
/ 20 мая 2019

У нас есть таблица т:

t:([] sym:`GOOG`IBM`APPL; px:10 20 30; size:1000 2000 3000)

Теперь мы хотим выбрать назначение столбца в выводе на основе условия, предоставленного в функции.

{[m]select sym, px, size, eb:?[`ab=m;`cd;`ef] from t where size>1000}[`ab] / This works fine providing proper value to eb in output(if/else)

Но мое требование основано на (если / еще, если) установить значение eb, как показано ниже, пробовал?, $, Но не сработало

{[m]select sym, px, size, eb:?[`ab=m;`cd;`yz=m;`ef] from t where size>1000}[`ab] / It fails with type error 

требование (код Sudo):

if (m==ab) { return cd};
else if (m==yz) {return ef};

Ответы [ 2 ]

5 голосов
/ 20 мая 2019

При использовании условного вектора ? необходимо вложить условные выражения.В этом примере несоответствие какому-либо условию вернет ноль.

q){[m]select sym, px, size, eb:?[`ab=m;`cd;?[`yz=m;`ef;`]] from t where size>1000}[`ab]
sym  px size eb
---------------
IBM  20 2000 cd
APPL 30 3000 cd

Если у вас много дискретных условий, это может стать очень громоздким, альтернативой будет использование словаря.

q)dict:`ab`yz!`cd`ef
q){[m]select sym, px, size, eb:dict[m] from t where size>1000}[`ab]
sym  px size eb
---------------
IBM  20 2000 cd
APPL 30 3000 cd
2 голосов
/ 20 мая 2019

Вы также можете использовать оператор find [?] , чтобы определить функцию для построения этого столбца:

q)f:{`cd`ef` `ab`yz?x}
q)f[`ab]
`cd
q)f[`yz]
`ef
q)f[`jk] // no match
`
q)select sym, px, size, eb:f[`ab] from t where size>1000
sym  px size eb
---------------
IBM  20 2000 cd
APPL 30 3000 cd
...