KX Community

Find answers, ask questions, and connect with our KX Community around the world.

Home Forums kdb+ Applying nested conditions in q

  • Applying nested conditions in q

    Posted by Laura on September 23, 2021 at 12:00 am

    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.

    Laura replied 1 month, 3 weeks ago 3 Members · 2 Replies
  • 2 Replies
  • cillianreilly

    Member
    September 23, 2021 at 12:00 am

    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

     

     

  • dwalshq

    Member
    September 23, 2021 at 12:00 am

    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

Log in to reply.