mySQL if

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

mySQL if

Inlägg av kifkroker »

Hej

Jag är inte så skolad i (my)SQL och ber därför om hjälp med följande: Jag undrar om det går att köra följande pseudo kod som en sqlfråga, och hur skulle det isåfall se ut?

Kod: Markera allt

SELECT kolumn FROM tabell WHERE a = 1
IF inga svar
   SELECT kolumn  FROM tabell WHERE a = 2
IF fortfarande inga svar
  SELECT kolumn  FROM tabell WHERE a = 3
Om första frågan inte genererar några svar så skall nästa körsas etc. Tack för eventull hjälp!
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Inlägg av gripner »

íf, for och andra sådana satser finns ej i SQL språket, du får lägga det i annan del av systemet, tex i php koden om du nu använder php.

/ Leif
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg av kifkroker »

sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Enklast (eller i alla fall en lösning) är att köra det som
3 separate queries från det språk/miljö där deet anropas från.

Om MySQL stöder "compund statements" så bör IF eller CASE
fungera. Det är dock lite oklart om MySQL stöder annat
än "singleton selects" (d.v.s ett statement som ger fler än
1 row) i sina THEN delar. Online dokumenationen är lite
oklar där...
larsson
Inlägg: 188
Blev medlem: 9 juni 2007, 16:49:21
Ort: Göteborg

Inlägg av larsson »

Du borde inte behöva IF för det, detta borde ge samma resultat som din pseudokod:

Kod: Markera allt

SELECT kolumn FROM tabell WHERE a IN (1,2,3) ;
Edit: Ovan talar inte om vilket 'a' som triggat urvalet (men det gör ju inte pseudokoden heller)
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det blir inte samma sak.

IN ger alla förekomster av 1, 2 och 3.
Jag tolkade det som att om 1 finns, så ska bara postera
med 1 komma med, o.s.v.
larsson
Inlägg: 188
Blev medlem: 9 juni 2007, 16:49:21
Ort: Göteborg

Inlägg av larsson »

Det har du rätt i, sodjan.

kifkroker, vad är det egentligen som skall utföras, eller är det bara ett hypotetiskt exempel?
gripner
Inlägg: 1169
Blev medlem: 4 december 2007, 14:47:39
Ort: Lidingö

Inlägg av gripner »

div databaser har div scriptspråk eller vad du väljer att kalla dem, tex plsql i oracle, dock bör man hålla sig ifrån sådant för att bibehålla portabilitet. Gör man så och håller sig till "ren" sql så finns ej tex IF
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg av kifkroker »

helt hypotetiskt är det inte, det är väl en kombination av att evetuellt snappa upp lite nytt och ett performance test på ett nuvarande projekt. Jag märker allt oftare hur jag gör omständiga saker i kod som jag redan kan ha gjort på mysqlsidan (såsom IFNULL() och konkatenering), inte för att detta var värst omständigt som "vanlig" kod dock. Lösningen idag, precis som sodjan föreslår, är att göra det som 3 x ca 2000 queries, men jag var lite nyfiken på om det gick snabbare med 1 x 2000 långa dito. Och frågarna är lite krångligare än a = 1. det var mest konceptet jag sökte.
larsson
Inlägg: 188
Blev medlem: 9 juni 2007, 16:49:21
Ort: Göteborg

Inlägg av larsson »

Ah, ok. Optimeringar kan vara bra hjärngymnastik.

Jag brukar också försöka avlasta PHP genom att stoppa in grovgörat i MySQL. Speciellt när det gäller tid- och datumberäkningar tycker jag MySQL är till god hjälp.

Hoppas du får bra värden på performance testet!
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Gör man så och håller sig till "ren" sql så finns ej tex IF

Vad menar du med "ren" SQL ? Vilken standard ?

ANSI/ISO 1989 SQL fanns redan sådant som t.ex BEGIN/END för compund statements.

ANSI/ISO 1992 SQL tillförde t.ex sådant som CASE/WHEN/THEN/ELSE/END-CASE (dock inget IF än).

I ANSI/ISO 1999 SQL kom IF/ELSEIF/END-IF och DO/WHILE/LEAVE/END-DO.

"SQL:1999 Core" är vad de flesta produkter i dag säger sig stödja,
men små, ofta plattformsspecifika, variationer.

Sen är det en annan sak att vissa produkter som t.ex Sybase med T-SQL
(och därmed även MS SQL Server efter som i princip är samma sak)
och Oracle (med PL/SQL) har byggt sina egna lösningar som inte riktigt
följer dessa ANSI/ISO SQL standard.

Senare SQL standards (SQL:2003 och SQL:2006) handlar med om t.ex
XML integration o.s.v och är inte lika intressanta ur en ren
rellationsdatabassynvinkel.
Skriv svar