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

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE
« kdy: 14-03-2018, 13:41:47 »
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.

99298

  • Host
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))

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
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

99300

  • Host
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).

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
Re:SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE
« Odpověď #4 kdy: 14-03-2018, 15:00:14 »
To by šlo, ďakujem za upozornenie.