Tento článek popisuje základní logiku podmínek v jazyce Power Query M. Na podmínky je v M-ku skvělý nástroj Podmíněný sloupec , ten ale umí jen nejjednodušší podmínky řetězené za sebe. Pokud bychom v M-ku chtěli podmínky vkládat do sebe nebo používat logické operátory, je třeba je napsat “ručně”.

Jak tedy na to?

Příklady budu ukazovat nad touto tabulkou, kde jednotlivé řádky obsahují jednotlivá auta.

Základní podmínka

Nejprve vytvořím podmínku, která bude rozpoznávat, jestli auto je nebo není Porsche. Ve vlastním sloupci to bude zapsané takto:

  • =if [Brand] = “Porsche
       thenTohle je Porsche
       elseTohle není Porsche

celý krok v M-ku bude vypadat takto:

  • = Table.AddColumn(#”Changed Type”, “Je tohle Porsche?”, each if [Brand] = “Porsche” then “Tohle je Porsche” else “Tohle není Porsche”)

Více navazujících podmínek

Tato podmínka rozpozná, jestli auto je Ford, Porsche, Fiat nebo jiná značka. Pokud by se stalo, že splněných bude více podmínek, bude zohledněna pouze ta první. Ve vlastním sloupci bude zápis vypadat takto. 

  • =if [Brand] = “Porsche” then “Tohle je Porsche”
    else if [Brand] = “Ford” then “Tohle je Ford”
    else if [Brand] = “Fiat” then “Tohle je Fiat”
    else “JIná značka”

Dvě současně platící podmínky

Je samozřejmě možné pracovat i s operátorem AND. Následující podmínka rozpozná, jestli se jedná o stříbrné Porsche nebo ne.

  • =if [Brand] = “Porsche” and [Color]= “Silver”
    then “Tohle je stříbrné Porsche”
    else “Tohle není stříbrné Porsche”

Dvě podmínky, z nichž platí alespoň jedna

Analogicky jako AND funguje v M-ku i operátor OR. Takto najdeme auta, která jsou buď stříbrná, nebo Porsche, nebo obojí.

  • =if [Brand] = “Porsche” or [Color]= “Silver” 
    then “Je to buď stříbrné Porsche, nebo jakékoliv jiné Porsche, nebo jakékoliv jiné stříbrné auto” 
    else “Tohle není žádné Porsche ani žádné stříbrné auto”

Kombinace AND a OR

Jak by to vypadalo, kdybychom chtěli najít modré Fordy a stříbrná Porsche? 

  • =if [Brand]=”Porsche” and [Color]=”Silver
    or [Brand]=”Ford” and [Color]=”Blue
    thenStříbrné Porsche nebo modrý Ford
    elseNěco jiného

Závorky

Už to začíná být trochu krkolomné, ale co kdybychom chtěli odhalit auta, která stříbrná, a současně jsou to Fordy nebo Porsche?

Takovýto zápis by byl chybný. Jako splněná by se objevila všechna Porsche bez ohledu na barvu, a k tomu stříbrné Fordy.

  • =if [Brand]=”Porsche” or [Brand]=”Fordand [Color]=”Silver
    thenStříbrný Ford nebo Porsche
    elseněco jiného

Problém vyřešíme tím, že přidáme závorky. Nejprve se tedy zjistí, jestli se jedná alespoň o jednu z hledaných značek, a až pak se zjistí, jestli je auto i stříbrné.

  • =if ([Brand]=”Porsche” or [Brand]=”Ford“) and [Color]=”Silver” 
    then “Stříbrný Ford nebo Porsche” 
    else “něco jiného

Podmínka v podmínce

Vraťme se k příkladu, kdy chceme najít všechna stříbrná Porsche, ale tentokrát bychom nechtěli používat funkci AND. Tento příklad se dá řešit i pomocí dvou podmínek v sobě (závorky tady nejsou nezbytně nutné):

  • =if [Color]=“Silver”
    then (if [Brand]=“Porsche”
       then “Stříbrné Porsche”
       elseNení stříbrné Porsche”)
    else “Není stříbrné Porsche”

1 Komentář

  1. Ahoj Petře 🙂
    Zrovna z tohohle článku to tak nevypadá, ale M-ko má prostě úplně jinou logiku a filosofii než VBA. VBA je uviverzální jazyk, ve kterém si můžeš napsat skoro cokoliv, M-ko je účelově zaměřené na to, že máš tabulku a tu v jednotlivých krocích upravuješ…

  2. K věci: Jak vypadá varianta Select..Case v Power Query (násobné elseif je strašné)? Jak vypadá syntaxe pro zástupné znaky (resp. v moderním jazyce pak jednoznačně chci podporu regulárních výrazů)? Co takový “Like”? Rozlišuje Power Query stavy Empty, Null, Nothing, Missing, prázdný řetězec? Relační operátory jsou podle všeho stejně hloupé jak ve VBA (viz zaměnitelnost přiřazovacího operátoru = a relačního operátoru =). Tohle je opsaná 20 let stará koncepce, která nemá lepší logiku než prastaré VBA.

  3. Ahoj, nejsem nijak fanatickým zastáncem M-ka, klidně připouštím že tam nemusí všechno fungovat ideálně.
    Na druhou stranu to, co píšeš, jsou věci, na které jsem za několik let intenzivní práce s Power BI a Power Query v Excelu nenarazil a neměl jsem na to jediný dotaz ani na pokročilých kurzech – troufnu si tvrdit, že jsou to marginality.
    A naopak to, že v Power Query je (pokud vím) prázdná buňka vždycky jako “null”, je pro mě naopak výrazné zjednodušení oproti Excelu, kde to s tou prázdností buněk vůbec tak přehledné není.

  4. Dobrá. Ještě možná dotaz za více čtenářů: Je tady někde na webu nějaký přehled pro orientování se v pojmech? Upřímně třeba mě zarazilo, proč se objevuje písmenko “M” v Power Query, a říkal jsem – co to je, něco nového, nedokázal jsem si to zařadit. Nakonec jsem si (možná špatně) odvodil, že vychází ze slova “mashup”. Ale člověk čte, čte a najednou pojem DAX a další… Tak jen pokud je, poprosím o odkaz na nějaký rozcestník, “start” pro “všechnopower”.

Komentáře není možné přidávat