Databáze > Ostatní DB

SQLite funkcia IIF ako nahrada CASE .. WHEN .. ELSE

(1/1)

miroB:
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:

--- Citace: Miroslav Baláž  14-03-2018, 13:41:47 ---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?

--- Konce citace ---

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 ---IIF(NULL, Eval(1), Eval(2))

miroB:
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:

--- Citace: Miroslav Baláž  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

--- Konce citace ---

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

miroB:
To by šlo, ďakujem za upozornenie.

Navigace

[0] Seznam témat

Přejít na plnou verzi