cancel
Showing results for 
Search instead for 
Did you mean: 

Applying nested conditions in q

LearnerKDB
New Contributor II

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

T:([]a:`F`R;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.

1 ACCEPTED SOLUTION

cillianreilly
New Contributor III

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<c
q)T:update newCol:`hi from T where a<>`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<c);all(a<>`F;c>d))from T
a b  c  d  newCol 
------------------
F 10 9  10 welcome
R 20 21 22 welcome

 

 

View solution in original post

3 REPLIES 3

cillianreilly
New Contributor III

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<c
q)T:update newCol:`hi from T where a<>`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<c);all(a<>`F;c>d))from T
a b  c  d  newCol 
------------------
F 10 9  10 welcome
R 20 21 22 welcome

 

 

Thanks Cillian. 

dwalshq
New Contributor
New Contributor

Another option is to use vector conditional (?)

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

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