Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: OPGELOST Van MySQL naar SQLite; probleem omzetten queries  (gelezen 856 keer)

Offline BaukeP

  • Lid
OPGELOST Van MySQL naar SQLite; probleem omzetten queries
« Gepost op: 2013/01/26, 17:57:08 »
Hallo,
Ik ben bezig een aantal MySQL-queries om te zetten naar SQLite. Dat gaat prima, er zijn minder verschillen dan ik eerst verwachtte. maar met het volgende sql gedeelte kom ik er even niet uit:

Oude MySQL versie:
, IF(IF(ROUND(w_s2_car/w_s2_temaken*100,3) >= 100 AND ROUND(w_s1_car/w_s1_temaken*100,3) >= 100, 1,
IF(ROUND(w_s2_car/w_s2_temaken*100,3) = ROUND(w_s1_car/w_s1_temaken*100,3), 1,
IF(ROUND(w_s2_car/w_s2_temaken*100,3) > ROUND(w_s1_car/w_s1_temaken*100,3) AND ROUND(w_s2_car/w_s2_temaken*100,3) >= 100, 2, 0)))=2, 1, 0) AS winst

Omgezet naar CASE ipv IF (SQLite kent geen IF):
, IF(COALESCE(CASE WHEN ROUND(w_s2_car/w_s2_temaken*100,3) >= 100 AND ROUND(w_s1_car/w_s1_temaken*100,3) >= 100 THEN 1 ELSE NULL END,
CASE WHEN ROUND(w_s2_car/w_s2_temaken*100,3) = ROUND(w_s1_car/w_s1_temaken*100,3) THEN 1 ELSE NULL END,
CASE WHEN ROUND(w_s2_car/w_s2_temaken*100,3) > ROUND(w_s1_car/w_s1_temaken*100,3) AND ROUND(w_s2_car/w_s2_temaken*100,3) >= 100 THEN 2 ELSE 0 END) =2, 1, 0) AS winst1

Het bovenstaande werkt in MySQL, maar om ook in SQLite te werken moet de laatste IF nog worden omgezet.

Ik dacht er nog een CASE (zie hieronder) omheen te zetten, maar dan krijg ik een syntax error (near THEN)

, CASE(COALESCE(CASE WHEN ROUND(w_s1_car/w_s1_temaken*100,3) >= 100 AND ROUND(w_s2_car/w_s2_temaken*100,3) >= 100 THEN 1 ELSE NULL END,
CASE WHEN ROUND(w_s1_car/w_s1_temaken*100,3) = ROUND(w_s2_car/w_s2_temaken*100,3) THEN 1 ELSE NULL END,
CASE WHEN ROUND(w_s1_car/w_s1_temaken*100,3) > ROUND(w_s2_car/w_s2_temaken*100,3) AND ROUND(w_s1_car/w_s1_temaken*100,3) >= 100 THEN 2 ELSE 0 END ) =2 THEN 1 ELSE 0) AS winst

Wie ziet de fout?

Alvast bedankt

Bauke
« Laatst bewerkt op: 2013/01/28, 22:03:09 door BaukeP »

Re: Van MySQL naar SQLite; probleem omzetten queries
« Reactie #1 Gepost op: 2013/01/27, 12:31:45 »
Ik weet het niet zeker, maar ik vind dat wel 1 ding opvalt, overal zet je CASE WHEN, behalve bij de eerste CASE, daar doe je gewoon CASE(), en binnen die CASE, gebruik je nog een CASE, maar er staat toch maar 1 THEN in die regel, dus dat lijkt me misschien een beetje fishy?

Offline BaukeP

  • Lid
Re: Van MySQL naar SQLite; probleem omzetten queries
« Reactie #2 Gepost op: 2013/01/28, 00:26:02 »
Beide mag: (zie volgende documentatie:
Both forms of the CASE expression use lazy, or short-circuit, evaluation.

The only difference between the following two CASE expressions is that the x expression is evaluated exactly once in the first example but might be evaluated multiple times in the second:

CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END

Maar je hebt wel gelijk.... er ontbreekt vlgs mij een WHEN aan het eind. Veranderd is hij zo:

, CASE
COALESCE
(
CASE WHEN ROUND(w_s1_car/w_s1_temaken*100,3) >= 100 AND ROUND(w_s2_car/w_s2_temaken*100,3) >= 100 THEN 1 ELSE NULL END,
CASE WHEN ROUND(w_s1_car/w_s1_temaken*100,3) = ROUND(w_s2_car/w_s2_temaken*100,3) THEN 1 ELSE NULL END,
CASE WHEN ROUND(w_s1_car/w_s1_temaken*100,3) > ROUND(w_s2_car/w_s2_temaken*100,3) AND ROUND(w_s1_car/w_s1_temaken*100,3) >= 100 THEN 2 ELSE 0 END
)
 WHEN 2 THEN 1 ELSE 0 END AS winst

Dus de coalesce geeft een waarde terug waar de eerste case op moet werken met de laatste regel. Dus verkort:

, CASE
COALESCE
(
code coalesce verwijderd
)
 WHEN 2 THEN 1 ELSE 0 END AS winst
« Laatst bewerkt op: 2013/01/28, 00:41:57 door BaukeP »

Offline BaukeP

  • Lid
Re: Van MySQL naar SQLite; probleem omzetten queries
« Reactie #3 Gepost op: 2013/01/28, 22:02:48 »
Ter info:
En dit is de werkende definitieve (de vorige had nog een probleem):

, CASE WHEN(
CASE WHEN ROUND(CAST(w_s1_car AS REAL)/CAST(w_s1_temaken AS REAL)*100,3) >= 100 AND ROUND(CAST(w_s2_car AS REAL)/CAST(w_s2_temaken AS REAL)*100,3) >= 100 THEN 1
WHEN ROUND(CAST(w_s1_car AS REAL)/CAST(w_s1_temaken AS REAL)*100,3) = ROUND(CAST(w_s2_car AS REAL)/CAST(w_s2_temaken AS REAL)*100,3) THEN 1
WHEN ROUND(CAST(w_s1_car AS REAL)/CAST(w_s1_temaken AS REAL)*100,3) > ROUND(CAST(w_s2_car AS REAL)/CAST(w_s2_temaken AS REAL)*100,3) AND ROUND(CAST(w_s1_car AS REAL)/CAST(w_s1_temaken AS REAL)*100,3) >= 100 THEN 2 ELSE 0 END)
=2 THEN 1 ELSE 0 END AS winst