Autor Téma: SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE  (Přečteno 1174 krát)

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
MS Access podporuje v SQL funkciu IIF( condition, expr1, expr2 )
Takúto funkciu viem v pohode vyrobiť.
Ale pozor: jeden z výrazov expr1, expr2 môže viesť k chybe.
Preto je v IIF ako prvý parameter podmienka, kde sa rozhodne, ktorý z výrazov vykonať. Lenže funkcie v SQLite bez ošetrenia, nevedia voliteľne ignorovať jeden z parametrov.
Výrazy expr1 a expr2 môžu byť funkcie. Pri ich výpočte potrebujem zistiť, ako dopadla podmienka. A podľa toho programovo zariadiť, aby sa tá "zlá" expr, ani nepočítala.. Pretože by viedla k chybe.
Samozrejme, že CASE WHEN by to riešil. Ale ten IIF je menej náročný na priestor .. (Sú aj iné dôvody)

Technicky popísané:
Ako mám v nejakej UDF funkcii zistiť, že je vlastne parametrom inej UDF funkcie?
A optimálne v druhom a treťom parametri/funkcii, skontrolovať výsledok výpočtu prvého parametra?
Podľa toho by som vedel, či môžem bez počítania napríklad vrátiť null?
Ďakujem
PS: niežeby som sa nepokúšal zistiť to sám. Ale už pár hodín je moja snaha bez výsledku.

Dal by sa odignorovať zbytočný exprX, cez try .. except ..   Lenže potom by som nevedel ošetriť ozajstné chyby.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1614
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE
« Odpověď #1 kdy: 14-03-2018, 14:00:06 »
Technicky popísané:
Ako mám v nejakej UDF funkcii zistiť, že je vlastne parametrom inej UDF funkcie?
A optimálne v druhom a treťom parametri/funkcii, skontrolovať výsledok výpočtu prvého parametra?
Podľa toho by som vedel, či môžem bez počítania napríklad vrátiť null?

To nezjistis. Alespon me nenapada jak. Engine bude IMHO jen volat callbacky. Ty uz vsak nemas moznost zjistit z kontextu odkud byl volan nebo zda je soucast parametru. Jinymi slovy, kdyby sis vyrobil funkce IIF a Eval, pak Ti SQLite neumozni z volani callback Eval zjistit ze je callback volan vne IIF:

Kód: MySQL [Vybrat]
  1. IIF(NULL, Eval(1), Eval(2))
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE
« Odpověď #2 kdy: 14-03-2018, 14:09:41 »
Tak to je v tomto prípade mrzuté. Predbežne teda to try .. except a NULL. Alebo na pozadí vyrobiť CASE WHEN.. Uvidím.
Ďakujem

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1614
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE
« Odpověď #3 kdy: 14-03-2018, 14:28:09 »
Tak to je v tomto prípade mrzuté. Predbežne teda to try .. except a NULL. Alebo na pozadí vyrobiť CASE WHEN.. Uvidím.
Ďakujem

FireDAC uz ma osetrene vyjimky vyvolane v implementoru udalosti OnCalculate v metode TSQLiteFunctionInstance.DoCalculate. Ten je preda SQLite a ten skonci spousteni chybou (kterou muzes detekovat).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 400
  • Karma: 16
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE
« Odpověď #4 kdy: 14-03-2018, 15:00:14 »
To by šlo, ďakujem za upozornenie.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: