# Using conditional logic in a Flow
Sometimes you have parts of a flow that you only want to run under certain conditions. To support this, Prefect provides several built-in tasks for control-flow that you can use to add conditional branches to your flow.
# Running a task based on a condition
Let's say you want to have a flow where different tasks are run based on the result of some conditional task. In normal Python code this logic might look like:
if check_condition():
val = action_if_true()
another_action(val)
else:
val = action_if_false()
another_action(val)
To implement the same logic as a Flow, you can make use of Prefect's case
blocks. Tasks added to a flow inside a case
block are only run if the
condition matches the case. Tasks in branches that aren't run will finish with
a Skipped
state.
The resulting flow looks like:
# Merging branches in a flow
Looking at the above flow, you might notice that another_action
is run on the
output of a task regardless of which branch is taken. If you were writing this
in normal Python code, you might refactor the logic as:
if check_condition():
val = action_if_true()
else:
val = action_if_false()
another_action(val)
To implement the same logic as a Flow, you can make use of Prefect's merge
function. This function takes one or more tasks conditional tasks, and returns
the output of the first task that isn't Skipped
. This can be used to "merge"
multiple branches in a flow together.
The resulting flow looks like: