Intelligent Apps support dynamic query generation using variables and Jinja-style templating. This allows you to build flexible dashboards that respond to user input from filters and variables.

Basic Variable Substitution

You can reference variables in your SQL queries using double curly braces:

query: |
  SELECT * FROM sales_orders WHERE order_date > '{{ order_date }}'

Conditional Query Blocks

You can use Jinja-style control structures to include or exclude parts of your query based on variable values:

query: |
  SELECT * FROM sales_orders
  WHERE 1=1
  {% if product_group != '' %}
    AND product_group = '{{ product_group }}'
  {% endif %}
  {% if membership_type != 'all' %}
    AND membership_type = '{{ membership_type }}'
  {% endif %}

Using Multiple Variables

Combine several variables for more complex filtering:

query: |
  SELECT * FROM sales_orders
  WHERE order_date BETWEEN '{{ start_date }}' AND '{{ end_date }}'
    AND amount > {{ min_amount }}

Example: Dynamic LIMIT

You can use variables to control query limits:

query: |
  SELECT * FROM sales_orders
  LIMIT {{ row_limit }}

Example: IN Clauses with Lists

If your variable is a list, you can use Jinja to join values for an IN clause:

query: |
  SELECT * FROM sales_orders
  WHERE region IN ({{ regions | join(", ") }})

Best Practices

  • Always provide sensible defaults for variables to avoid empty queries.
  • Use {% if ... %} blocks to prevent SQL errors when variables are empty or unset.
  • Sanitize and validate user input where possible.

Reference: Jinja Syntax

  • {{ variable }}: Insert variable value
  • {% if ... %} ... {% endif %}: Conditional blocks
  • {% for ... %} ... {% endfor %}: Loops (for advanced use)
  • Filters like | join(", ") for lists

See also: Filters, Overview, Charts