Applying nested conditions in q

https://learninghub.kx.com/forums/topic/applying-nested-conditions-in-q

I want to add a column to an existing table based on nested conditions

T:(a:FR;b:10 20;c:9 21;d:10 22)

Func:{[tab]

If a=`F

If b<c

Add new column with value as 'hi

Else

new='welcome

Else

if c>d

new=`hi

Else

new='welcome

}

Please help.

This is most easily done in two parts and then defaulting the rest to welcome:

 

q)T:update newCol:`hi from T where a=`F,b`F,c>d 
q)T:update`welcome^newCol from T 
q)T 
a b c d newCol 
------------------ 
F 10 9 10 welcome 
R 20 21 22 welcome

 

You may find the reference on update statements useful: https://code.kx.com/q/ref/update/

If you want it done in one line (which doesn’t scale well for any additional clauses you might want):

 

q)update newCol:`welcome`hi any(all(a=`F;b`F;c>d))from T 
a b c d newCol 
------------------ 
F 10 9 10 welcome 
R 20 21 22 welcome

 

 

Another option is to use vector conditional (?)

https://code.kx.com/q/ref/vector-conditional/

q)update new_col:?[a=`F;[?[bd;`hi;`welcome]]] from T 
a b c d new_col 
------------------ 
F 10 9 10 welcome 
R 20 21 22 welcome