IF/ELSE/CASE i query?

clinton4

Medlem
Hei,

Er det mulig å bruke IF/ELSE eller CASE i en mysql query?

Feks:

IF (SELECT * FROM table WHERE id = id AND navn = navn)
UPDATE table SET sum = sum + sum WHERE id = id AND navn = navn
ELSE
INSERT INTO table (navn, sum) VALUES ('navn', sum')
END

..eller..

IF (SELECT * FROM table WHERE id = id AND navn = navn)
CASE
WHEN id = id THEN UPDATE table SET sum = sum + sum WHERE id = id AND navn = navn
WHEN id != id THEN INSERT INTO table (navn, sum) VALUES ('navn', sum')
END

Jeg kjenner til ON DUPLICATE KEY UPDATE, men den lar seg ikke bruke i dette tilfellet.

Kan noen gi meg et eksempel på hvordan jeg bruker IF/ELSE eller CASE i en query?
 

adeneo

Medlem
Jeg er ikke spesielt god på SQL, og har emigrert til cassandra, mongo, redis osv. nettopp fordi jeg får angst og mareritt om natten av SQL (ikke at CQL er så mye bedre ?).

Meeen, det ser ut som det du egentlig prøver å gjøre er å sjekke om raden eksisterer, og så enten sette inn eller oppdatere basert på det, og den vanlige måten å gjøre det på er å først kjøre en "exists" spørring.

Husk at asterix aldri er din venn, hent de radene du trenger, trenger du alle radene så greit nok. I en "exists" spørring blir dog radene som skal hentes oversett, så du kan bruke hva som helst :

PHP:
SELECT EXISTS(SELECT 'id' FROM table WHERE id = id AND navn = navn)

en slik spørring bør være rask, og i PHP returneres vel bare 0 eller 1, som du bruker i en if / else (eller ternary).

Nå gidder ikke jeg skrive PDO da det er så mye jobb, så det blir litt pseudo kode :

PHP:
$exists = $mysqli->query("SELECT EXISTS(SELECT 9 FROM table WHERE id = id AND navn = navn)");
                                           // ^^^ spiller ingen rolle, du kan bruke "null" hvis du vil ?
$mysqli->query($exists ? "UPDATE table SET ....."  :  "INSERT INTO table ....");

count() kan også brukes, hva som er raskest ser ut til å variere noe?
Det er ingen grunn til å gjøre det mer komplisert enn det er ?
 
Sist redigert:
Topp