jq · lesson 24 of 32 · Tables & lookups
IN
IN(…) asks whether its input is one of several values and answers true or false, so it belongs inside select(…). IN(source; values) asks whether any value of source is among values.
Examples
Example 1Members whose role is one of several
Document
{
"team": "Platform",
"office": { "city": "Berlin", "floor": 3 },
"members": [
{ "name": "Ada", "age": 36, "role": "lead", "active": true,
"email": "[email protected]", "skills": ["rust", "sql"] },
{ "name": "Linus", "age": 28, "role": "dev", "active": true,
"email": null, "skills": ["c", "shell"] },
{ "name": "Grace", "age": 45, "role": "dev", "active": false,
"skills": ["cobol"] },
{ "name": "Alan", "age": 41, "role": "qa", "active": true,
"email": "[email protected]", "skills": [] }
]
}Query
.members[] | select(.role | IN("dev", "qa")) | .name
select(Keep a member only if the test inside is true..role | IN("dev", "qa")True when the role equals any of the listed values..nameThen take the name.
Result
"Linus" "Grace" "Alan"
Example 2Is any member in QA?
Document
{
"team": "Platform",
"office": { "city": "Berlin", "floor": 3 },
"members": [
{ "name": "Ada", "age": 36, "role": "lead", "active": true,
"email": "[email protected]", "skills": ["rust", "sql"] },
{ "name": "Linus", "age": 28, "role": "dev", "active": true,
"email": null, "skills": ["c", "shell"] },
{ "name": "Grace", "age": 45, "role": "dev", "active": false,
"skills": ["cobol"] },
{ "name": "Alan", "age": 41, "role": "qa", "active": true,
"email": "[email protected]", "skills": [] }
]
}Query
IN(.members[].role; "qa")
.members[].roleThe stream of values to check: every member's role."qa"The values to look for. The answer istrueif any of the first stream is among these.
Result
true
Example 3Skills that are not on a list
Document
{
"team": "Platform",
"office": { "city": "Berlin", "floor": 3 },
"members": [
{ "name": "Ada", "age": 36, "role": "lead", "active": true,
"email": "[email protected]", "skills": ["rust", "sql"] },
{ "name": "Linus", "age": 28, "role": "dev", "active": true,
"email": null, "skills": ["c", "shell"] },
{ "name": "Grace", "age": 45, "role": "dev", "active": false,
"skills": ["cobol"] },
{ "name": "Alan", "age": 41, "role": "qa", "active": true,
"email": "[email protected]", "skills": [] }
]
}Query
[.members[].skills[] | select(IN("rust", "sql") | not)]
.members[].skills[]Every skill of every member.IN("rust", "sql")True for a skill on the list.| notTurns it around: keep the skills that are not on the list.
Result
["c","shell","cobol"]
Good to know
INcompares with==:1and1.0are equal,"1"is not.- Without
select,INjust gives the answer:.members[] | .role | IN("dev", "qa")is a stream oftrueandfalse.