Writing a simple if statement in Power Query’s M expression language is straightforward. Using an Excel table called Input that contains a single value as the starting point:
The following query shows how to use an if … then … else statement to test whether the value from the table is equal to 5:
let
Source = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
InputValue = Source{0}[Input],
IfStatement = if InputValue=5
then "The number is five"
else "The number is not five"
in
IfStatement
What about more complex conditional logic? The M language doesn’t include anything like a case statement, but it is possible to write the equivalent of one quite easily.
Here’s an example of a simple case statement:
let
Source = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
InputValue = Source{0}[Input],
CaseValues = {
{1, "First"},
{2, "Second"},
{3, "Third"},
{4, "Fourth"},
{5, "Fifth"},
{InputValue, "Else condition"}
},
SimpleCase = List.First(List.Select(CaseValues, each _{0}=InputValue)){1}
in
SimpleCase
This works as follows:
- The CaseValues step defines a list containing six items, each of which is itself a list containing a number and some text. The number is the value to compare to the input value, and the text is what will be returned if the number does match the input value.
- The last item in the CaseValues list contains the input value, so this will be returned where the input value matches none of the preceding values
- The SimpleCase step uses List.Select() to filter the list in CaseValues so that only the items in the list where the input value matches the number in the list.
- Since List.Select itself returns a list, this list is then passed to List.First() to get the first item in the list returned by List.Select (there should only be one item in the list in this particular query), and then {1} returns the text from that item. This is the output of the query.
You can write a searched case expression in a very similar way, by declaring functions that return boolean values instead of using numbers as follows:
let
Source = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
InputValue = Source{0}[Input],
CaseValues = {
{ (x)=>x<10, "Less than 10"},
{ (x)=>x<20, "Less than 20"},
{ (x)=>x<30, "Less than 30"},
{ (x)=>x<40, "Less than 40"},
{ (x)=>x<50, "Less than 50"},
{ (x)=>true, "Else condition"}
},
SimpleCase = List.First(List.Select(CaseValues, each _{0}(InputValue))){1}
in
SimpleCase
In this query the CaseValues step contains a list of lists, where each item in the list consists of list containing a function and a text value. List.Select calls each function and only returns the items where the function returns true, and finally the text from the first item that List.Select returns is the output of the query.
You can download the sample workbook here.