This document provides comprehensive examples of JSON Logic expressions and their SQL output.
{"var": "name"}WHERE name{"var": 1}WHERE data[1]{"var": ["status", "pending"]}WHERE COALESCE(status, 'pending'){"missing": "email"}WHERE email IS NULL{"missing": ["email", "phone"]}WHERE (email IS NULL OR phone IS NULL){"missing_some": [1, ["field1", "field2"]]}WHERE (field1 IS NULL OR field2 IS NULL){">": [{"var": "amount"}, 1000]}WHERE amount > 1000{"==": [{"var": "status"}, "active"]}WHERE status = 'active'{"===": [{"var": "count"}, 5]}WHERE count = 5{"!=": [{"var": "status"}, "inactive"]}WHERE status != 'inactive'{"!==": [{"var": "count"}, 0]}WHERE count <> 0{"==": [{"var": "deleted_at"}, null]}WHERE deleted_at IS NULL{"!=": [{"var": "field"}, null]}WHERE field IS NOT NULL{"!": [{"var": "isDeleted"}]}WHERE NOT (isDeleted){"!": {"var": "isDeleted"}}WHERE NOT (isDeleted){"!": true}WHERE NOT (TRUE){"!!": [{"var": "value"}]}-- Without schema (generic truthiness check):
WHERE (value IS NOT NULL AND value != FALSE AND value != 0 AND value != '')
-- With schema (type-appropriate SQL){"!!": [[]]}WHERE FALSE{"!!": [[1, 2, 3]]}WHERE TRUE{"and": [
{">": [{"var": "amount"}, 5000]},
{"==": [{"var": "status"}, "pending"]}
]}WHERE (amount > 5000 AND status = 'pending'){"or": [
{">=": [{"var": "failedAttempts"}, 5]},
{"in": [{"var": "country"}, ["CN", "RU"]]}
]}WHERE (failedAttempts >= 5 OR country IN ('CN', 'RU')){"if": [
{">": [{"var": "age"}, 18]},
"adult",
"minor"
]}WHERE CASE WHEN age > 18 THEN 'adult' ELSE 'minor' END{">": [{"var": "amount"}, 1000]}WHERE amount > 1000{">=": [{"var": "score"}, 80]}WHERE score >= 80{"<": [{"var": "age"}, 65]}WHERE age < 65{"<=": [{"var": "count"}, 10]}WHERE count <= 10{"max": [{"var": "score1"}, {"var": "score2"}, {"var": "score3"}]}WHERE GREATEST(score1, score2, score3){"min": [{"var": "price1"}, {"var": "price2"}]}WHERE LEAST(price1, price2){"+": [{"var": "price"}, {"var": "tax"}]}WHERE (price + tax){"-": [{"var": "total"}, {"var": "discount"}]}WHERE (total - discount){"*": [{"var": "price"}, 1.2]}WHERE (price * 1.2){"/": [{"var": "total"}, 2]}WHERE (total / 2){"%": [{"var": "count"}, 3]}WHERE (count % 3){"-": [{"var": "value"}]}WHERE -value{"+": ["-5"]}WHERE CAST(-5 AS NUMERIC)String literals in arithmetic are coerced to numbers when valid, or safely quoted otherwise:
{"+": ["42", 1]}
{"*": [" 3 ", 2]}
{"+": ["3.14", 1]}
{"+": ["hello", 1]}WHERE (42 + 1)
WHERE (3 * 2)
WHERE (3.14 + 1)
WHERE ('hello' + 1)Large integers are preserved without precision loss:
{"+": ["9223372036854775808", 1]}WHERE (9223372036854775808 + 1){"in": [{"var": "country"}, ["US", "CA", "MX"]]}WHERE country IN ('US', 'CA', 'MX')When a schema is provided, array elements are coerced to match the field type:
// Schema: sector_code is string type, amount is integer type
{"in": [{"var": "sector_code"}, [5960, 9000]]}
{"in": [{"var": "amount"}, ["100", "200", "300"]]}WHERE sector_code IN ('5960', '9000')
WHERE amount IN (100, 200, 300){"in": ["hello", "hello world"]}WHERE POSITION('hello' IN 'hello world') > 0{"map": [{"var": "numbers"}, {"+": [{"var": "item"}, 1]}]}WHERE ARRAY(SELECT (elem + 1) FROM UNNEST(numbers) AS elem){"filter": [{"var": "scores"}, {">": [{"var": "item"}, 70]}]}WHERE ARRAY(SELECT elem FROM UNNEST(scores) AS elem WHERE elem > 70){"reduce": [{"var": "numbers"}, {"+": [{"var": "accumulator"}, {"var": "current"}]}, 0]}WHERE 0 + COALESCE((SELECT SUM(elem) FROM UNNEST(numbers) AS elem), 0){"all": [{"var": "ages"}, {">=": [{"var": ""}, 18]}]}WHERE NOT EXISTS (SELECT 1 FROM UNNEST(ages) AS elem WHERE NOT (elem >= 18)){"some": [{"var": "statuses"}, {"==": [{"var": ""}, "active"]}]}WHERE EXISTS (SELECT 1 FROM UNNEST(statuses) AS elem WHERE elem = 'active'){"none": [{"var": "values"}, {"==": [{"var": ""}, "invalid"]}]}WHERE NOT EXISTS (SELECT 1 FROM UNNEST(values) AS elem WHERE elem = 'invalid'){"merge": [{"var": "array1"}, {"var": "array2"}]}WHERE ARRAY_CONCAT(array1, array2){"cat": [{"var": "firstName"}, " ", {"var": "lastName"}]}WHERE CONCAT(firstName, ' ', lastName){"cat": [{"if": [{"==": [{"var": "gender"}, "M"]}, "Mr. ", "Ms. "]}, {"var": "first_name"}, " ", {"var": "last_name"}]}WHERE CONCAT(CASE WHEN (gender = 'M') THEN 'Mr. ' ELSE 'Ms. ' END, first_name, ' ', last_name){"substr": [{"var": "email"}, 0, 10]}WHERE SUBSTR(email, 1, 10){"substr": [{"var": "email"}, 4]}WHERE SUBSTR(email, 5){">": [{"+": [{"var": "base"}, {"*": [{"var": "bonus"}, 0.1]}]}, 1000]}WHERE (base + (bonus * 0.1)) > 1000{"and": [
{">": [{"var": "transaction.amount"}, 10000]},
{"or": [
{"==": [{"var": "user.verified"}, false]},
{"<": [{"var": "user.accountAgeDays"}, 7]}
]}
]}WHERE (transaction.amount > 10000 AND (user.verified = FALSE OR user.accountAgeDays < 7)){"if": [
{"and": [
{">=": [{"var": "age"}, 18]},
{"==": [{"var": "country"}, "US"]}
]},
"eligible",
"ineligible"
]}WHERE CASE WHEN (age >= 18 AND country = 'US') THEN 'eligible' ELSE 'ineligible' END{"and": [
{">": [{"var": "transaction.amount"}, 10000]},
{"or": [
{"==": [{"var": "user.verified"}, false]},
{"<": [{"var": "user.accountAgeDays"}, 7]},
{">=": [{"var": "user.failedAttempts"}, 3]}
]},
{"in": [{"var": "user.country"}, ["high_risk_1", "high_risk_2"]]}
]}WHERE (transaction.amount > 10000 AND (user.verified = FALSE OR user.accountAgeDays < 7 OR user.failedAttempts >= 3) AND user.country IN ('high_risk_1', 'high_risk_2')){"if": [
{"and": [
{">=": [{"var": "age"}, 18]},
{"==": [{"var": "hasLicense"}, true]},
{"<": [{"var": "violations"}, 3]}
]},
"approved",
{"if": [
{"<": [{"var": "age"}, 18]},
"too_young",
"rejected"
]}
]}WHERE CASE WHEN (age >= 18 AND hasLicense = TRUE AND violations < 3) THEN 'approved' ELSE CASE WHEN age < 18 THEN 'too_young' ELSE 'rejected' END ENDAll examples above can be generated with bind parameter placeholders instead of inlined literals by using the TranspileParameterized family of methods.
sql, params, _ := jsonlogic2sql.TranspileParameterized(
jsonlogic2sql.DialectBigQuery,
`{"==": [{"var": "status"}, "active"]}`,
)
// sql = "WHERE status = @p1"
// params = [{Name: "p1", Value: "active"}]sql, params, _ := jsonlogic2sql.TranspileParameterized(
jsonlogic2sql.DialectBigQuery,
`{"in": [{"var": "country"}, ["US", "CA", "MX"]]}`,
)
// sql = "WHERE country IN (@p1, @p2, @p3)"
// params = [{Name: "p1", Value: "US"}, {Name: "p2", Value: "CA"}, {Name: "p3", Value: "MX"}]sql, params, _ := jsonlogic2sql.TranspileParameterized(
jsonlogic2sql.DialectPostgreSQL,
`{"and": [{">": [{"var": "amount"}, 10000]}, {"==": [{"var": "status"}, "pending"]}]}`,
)
// sql = "WHERE (amount > $1 AND status = $2)"
// params = [{Name: "p1", Value: 10000}, {Name: "p2", Value: "pending"}]condition, params, _ := jsonlogic2sql.TranspileConditionParameterized(
jsonlogic2sql.DialectBigQuery,
`{">": [{"var": "amount"}, 1000]}`,
)
// condition = "amount > @p1"
// params = [{Name: "p1", Value: 1000}]
query := fmt.Sprintf("SELECT * FROM orders WHERE %s AND created_at > @date", condition)See Parameterized Queries for full documentation.
- Operators - Full operator reference
- Custom Operators - Creating custom operators
- Schema Validation - Field validation
- Parameterized Queries - Bind-parameter output for safe SQL execution