# $ Cond¶ Conditional evaluation $[test;et;ef;…]

Control construct: test, et, ef, etc. are q expressions.

## Three expressions¶

If test evaluates to zero, Cond evaluates and returns ef, otherwise et.

q)$[0b;true;false] false q)$[1b;true;false]
true

Only the first expression test is certain to be evaluated.

q)$[1b;true;x:false] true q)x 'x Although it returns a result, Cond is a control-flow construct, not an operator. It cannot be iterated, nor projected onto a subset of expressions. ## Odd number of expressions¶ For brevity, nested triads can be flattened. $[q;a;r;b;c] <=> $[q;a;$[r;b;c]]

These two expressions are equivalent:

$[0;a;r;b;c]$[r;b;c]

Cond with many expressions can be translated to triads by repeatedly replacing the last three expressions with the triad.

$[q;a;r;b;s;c;d] <=> $[q;a;$[r;b;$[s;c;d]]]

Equivalently

$[q;a; / if q, a r;b; / else if r, b s;c; / else if s, c d] / else d Cond in a signum-like function q){$[x>0;1;x<0;-1;0]}'[0 3 -9]
0 1 -1

## Even number of expressions¶

An even number of expressions returns either a result or the generic null.

q)$[1b;true;1b;foo] true q)$[0b;true;1b;foo]
foo
q)$[0b;true;0b;foo] / return generic null q)$[0b;true;0b;foo]~(::)
1b

Versions before V3.6 2018.12.06 signal cond.

## Name scope¶

Cond’s brackets do not create lexical scope. Name scope within its brackets is the same as outside them.

Good style avoids using Cond to control side effects, such as amending variables.

Using if` is a clearer signal to the reader that a side effect is intended.)

Also, setting a variable in a code branch can have unintended consequences.

## Query templates¶

Cond is not supported inside qSQL queries. Instead, use Vector Conditional.