ugrás a tartalomhoz

SELECT sub PREPARE

vtsoftware · 2014. Dec. 11. (Cs), 13.43
Sziasztok!

Van egy feladatom, ahol matematikai műveleteket kell végrehajtanom, soronként mást, de az adatok forrása ugyan az.

Pl.:
---
id | keplet | x | y | z | eredmény
0 | (z*x) | 2 | 0.5 | 10 | 20
1 | (y-x) | 3 | 5 | 2 | 2
---
Az eredmény-t nem tudom hogy milyen lekéréssel lehetne kiszámolni.
A gond annyi, hogy lehet a képlet bármi, nem csak ilyen egyszerűek.
Az is lehet, hogy nem csak képletet tartalmaz, lehet sql parancs is.
Sőt, utóbbi jobb is lenne...

Ahogy olvasgattam, keresgéltem az EXECUTE látszik kézenfekvőnek.
SELECT
  (
    SET @qry = CONCAT('SELECT ', `math`.`keplet`);
    PREPARE stmt FROM @qry;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  ) as `eredmeny`
FROM
  `math`
Ezt elmélet gyanánt írtam le, mert egyrészt nem működik, másrészt remélem jól szemlélteti a szándékom :)

Ugyanakkor magában a következő kód működik:
SET @qry = CONCAT('SELECT ', '(5*4)');
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
PHP-ben is elvégezhetném a számolást, de úgy gondolom a MySQL gyorsabban számolna esetemben mint a PHP... meg egyébként is.
A lényeg, hogy utóbbit kellene minden soron végrehajtani.
Valakinek volna ötlete, megoldása erre?

Nagyon köszönöm
 
1

PostgreSQL-ben én ilyesmit

kuka · 2014. Dec. 11. (Cs), 18.45
PostgreSQL-ben én ilyesmit tárolt függvénnyel végeztem. MySQL esetében nincs gyakorlatom velük, de szintén abban az irányban próbálnék elindulni: create function.

[később]
Cumi. Akár a mafla MSSQL: „Dynamic SQL is not allowed in stored function or trigger” – és innentől fejre is állhatsz, mert legfeljebb tárolt eljárást használhatsz, amitől a kódod még nem lesz szebb. Szóval korábbi javaslat visszavonva. :(
2

- futtasd le a képlet

Hidvégi Gábor · 2014. Dec. 12. (P), 10.06
- futtasd le a képlet lekérdezését, az eredményt tedd bele a megfelelő mezőbe
- kérdezd le az eredményt

Azzal, hogy ez mennyire gyors, akkor kell csak foglalkozni, ha már lassú a rendszer.