What if you could change your entire data analysis with just one setting instead of hunting through hundreds of lines of code?
Why Variables and control flow in dbt? - Purpose & Use Cases
Imagine you have a big data project where you need to run the same analysis but with different settings each time. You try to change values everywhere manually in your SQL files and scripts.
Every time you want to test a new scenario, you have to find and replace numbers or conditions in many places.
This manual way is slow and confusing. You might forget to change some values or make mistakes that break your queries.
It's hard to keep track of what settings you used for each run, and fixing errors takes a lot of time.
Using variables and control flow in dbt lets you write flexible code that changes behavior based on simple settings.
You define variables once and use them everywhere. Control flow lets you decide which parts of your code run depending on those variables.
This makes your project easier to manage, test, and update.
SELECT * FROM sales WHERE region = 'North'; -- Change 'North' manually for each region
SELECT * FROM sales WHERE region = '{{ var("region_name", "North") }}'; {% if var("region_name") == "North" %} -- special logic for North {% endif %}
You can build smart, reusable data models that adapt automatically to different needs without rewriting code.
A data analyst wants to generate monthly reports for different regions. Instead of copying queries for each region, they use variables to switch regions and control flow to customize filters, saving hours of work.
Variables let you store values once and reuse them everywhere.
Control flow helps your code make decisions based on those variables.
Together, they make your data projects flexible, easier to maintain, and less error-prone.
Practice
{% set %} statement do in dbt?Solution
Step 1: Understand the purpose of
The{% set %}{% set %}statement in dbt is used to create a variable that holds a value.Step 2: Identify its use in code reuse
This variable can then be reused multiple times in your dbt project, making code cleaner and easier to maintain.Final Answer:
It creates a variable to store a value for reuse. -> Option DQuick Check:
{% set %}creates variables [OK]
{% set %} means 'store this value' [OK]- Thinking
{% set %}runs SQL directly - Confusing it with model creation
- Assuming it deletes data
my_var with value 10 in dbt?Solution
Step 1: Recall dbt variable syntax
In dbt, variables are created using the Jinja syntax:{% set variable_name = value %}.Step 2: Check each option
{% set my_var = 10 %} matches the correct syntax exactly. Options B and C use wrong keywords or delimiters. {% set 'my_var' = 10 %} incorrectly quotes the variable name.Final Answer:
{% set my_var = 10 %} -> Option AQuick Check:
Correct variable syntax uses{% set %}[OK]
- Using {{ }} instead of {% %} for setting variables
- Quoting variable names incorrectly
- Using wrong keywords like var
{{ greeting }}?
{% set hour = 15 %}
{% if hour < 12 %}
{% set greeting = 'Good morning' %}
{% elif hour < 18 %}
{% set greeting = 'Good afternoon' %}
{% else %}
{% set greeting = 'Good evening' %}
{% endif %}
{{ greeting }}Solution
Step 1: Evaluate the value of
The variablehourhouris set to 15.Step 2: Check the if-elif-else conditions
Since 15 is not less than 12, the first condition fails. It is less than 18, so the second condition is true, settinggreetingto 'Good afternoon'.Final Answer:
Good afternoon -> Option CQuick Check:
15 < 18 -> 'Good afternoon' [OK]
- Assuming hour 15 is morning
- Ignoring elif and jumping to else
- Thinking variable is undefined
{% set total = 0 %}
{% for i in range(3) %}
{% set total = total + i %}
{% endfor %}
{{ total }}Solution
Step 1: Understand Jinja in dbt limitations
dbt uses Jinja templating, which does not support Python'srange()function directly.Step 2: Identify the error cause
Usingrange(3)will cause an error becauserangeis undefined in this context.Final Answer:
Therangefunction is not available in dbt Jinja. -> Option AQuick Check:
Norange()in dbt Jinja [OK]
- Assuming Python functions work in Jinja
- Trying to update variables inside loops without workarounds
- Using wrong loop syntax
env to switch between two schemas: dev_schema if env is 'dev', else prod_schema. Which code snippet correctly implements this control flow?Solution
Step 1: Understand conditional variable assignment in dbt
dbt supports control flow with{% if %}and{% else %}blocks to set variables based on conditions.Step 2: Check each option for correctness
{% if env == 'dev' %} {% set schema = 'dev_schema' %} {% else %} {% set schema = 'prod_schema' %} {% endif %} SELECT * FROM {{ schema }}.my_table uses proper if-else blocks to setschemacorrectly before using it in the query. {% set schema = 'dev_schema' if env == 'dev' else 'prod_schema' %} SELECT * FROM {{ schema }}.my_table uses Python-style inline if which is not supported in Jinja. {% set schema = env == 'dev' and 'dev_schema' or 'prod_schema' %} SELECT * FROM {{ schema }}.my_table uses a Python boolean expression which is not valid in Jinja. {% set schema = 'prod_schema' %} {% if env == 'dev' %} {% set schema = 'dev_schema' %} SELECT * FROM {{ schema }}.my_table setsschemafirst then tries to reset inside if but the query is inside the if block, causing scope issues.Final Answer:
Option B correctly uses if-else to set schema and then queries it. -> Option BQuick Check:
Use {% if %}...{% else %}...{% endif %} for control flow [OK]
- Trying Python inline if syntax in Jinja
- Placing SQL inside if blocks incorrectly
- Not setting variable before using it
Ready to prove it?
Pass the test and this pattern moves unknown
