if式jqの条件式はif A then B else C endです。
if-then-elseも、jqのほかの組み込みと同じように、ひとつのフィルターです。入力を受け取り、出力を生成します。
式Aが「真」とみなされる値を生成すると、ifフィルターはBを評価します。そうでなければCを評価します。ifフィルターへの入力は、BまたはCに渡されます。
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
else節は省略できます。次の2つの文は同じ意味です。
if A then B else . end
if A then B end
if文elifを使うと、条件をさらに追加できます。
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
elif節は必要なだけいくつでも使えます。
jqで「false」となる値は、falseとnullだけです。それ以外はすべて「true」になります。数値のゼロや、空の文字列・配列・オブジェクトでさえも「true」です。
真偽値演算子のandとorを使うと、複雑なクエリを組み立てられます。
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
否定するには、notを使います。これは演算子ではなくフィルターです。
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
代替演算子を使うと、式がfalseまたはnullだった場合の「デフォルト」の値を指定できます。
A // B
# This is identical to
if A then A else B end
実際に確かめてみましょう。
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
ほかの言語から来たプログラマーは、cond、case、switch、when、unless、三項演算子など、より多彩な条件分岐の命令を期待するかもしれません。上に挙げた演算子が、jqにあるすべてです。