In jq
numbers can be compared using the following relational and equality operators.
Comparison | Operator |
---|---|
Greater than | a > b |
Greater than or equals | a >= b |
Less than | a < b |
Less than or equals | a <= b |
Equals | a == b |
Not equals | a != b |
The result of the comparison is always a boolean value, so either true
or false
.
1 < 3, # => true
2 != 2, # => false
1 == 1.0 # => true
# All numbers are floating-points, so this is different syntax
# for the exact same value.
The comparison operators above can also be used to compare strings. In that case, a dictionary (lexicographical) order is applied. The ordering is by unicode codepoint value.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
You need to be careful when you compare two variables that appear to contain numeric values but are of type string. Due to the dictionary order, the result will not be the same as comparing values of type number.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
The jq
==
operator is like Javascript's ===
in the sense that things that "look" the same, but are of different types, are not equal.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Two arrays are equal if all the corresponding elements are equal.
[1, 2, 3] == [1, 2, 3] # => true
[1, 2, 3] == [1, 3, 2] # => false, different order
[1, 2, 3] == [1, 2, "3"] # => false, different types
Two objects are equal if they have the same key-value pairs.
{name: "Joe", age: 42} == {age: 42, name: "Joe"} # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"} # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"} # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175} # => false
# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}} # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}} # => false