[MySQL] CONCAT bij enkele van de resultaten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Tofu
  • Registratie: Maart 2003
  • Laatst online: 05-10-2024
Voor mijn postfix configuratie ben ik op zoek naar een MySQL query.

Dit is een tabel:
code:
1
2
3
4
Tabel Destinations
ID  Source                              Destination
1   gebruiker1@tweakers.net   mailboxGebruiker1
2   gebruiker2@tweakers.net webmaster@google.com
Ik wil nu dat als de Destination geen @ bevat, dat er "@v" achter geplaatst wordt.
Als ik de gebruiker1@tweakers.net ingeef wil ik "mailboxGebruiker1@v" terugkrijgen.
Geef ik gebruiker2@tweakers.net op, dan wil ik webmaster@google.com terugkrijgen.

Zelf had ik dit al bedacht:
SQL:
1
2
3
4
SELECT CONCAT(
   (SELECT CONCAT(Destination,"@v") FROM Destinations WHERE Source='gebruiker1@tweakers.net' AND Destination NOT LIKE '%@%'),
   (SELECT Destination FROM Destinations WHERE Source='gebruiker1@tweakers.net' AND Destination LIKE '%@%')
);
Maar dan krijg ik helaas NULL terug. Hoe los ik dit op?

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Kijk naar IF en de INSTR functie.

Acties:
  • 0 Henk 'm!

Verwijderd

In jouw query geeft 1 van beide kanten altijd NULL terug, en iets + NULL is per definitie NULL.
ISNULL of IFNULL gebruiken (weet niet welke MySQL ondersteunt) om NULL te vervangen door '' is een optie, of een simpele UNION. Of rutgerw's oplossing.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom zou je dit in MySQL op willen lossen? Ik neem even aan dat je met PHP werkt, dan kan je dit soort bewerkingen toch mooi daar doen?

Door het op te lossen in SQL gaat je query er ieder geval niet mooier op worden, en in PHP is het gewoon een duidelijk overzichtelijk stukje code.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Tofu
  • Registratie: Maart 2003
  • Laatst online: 05-10-2024
Bedankt voor jullie reacties.
IF had ik al bekeken, maar ik kwam er niet uit. Het leek mij hopeloos ingewikkeld te worden met IF.
Ik moet dan namelijk eerst gaan zoeken, dan nog gaan nakijken of iets gevonden is, ..

Ik dacht dat NULL wel automatisch naar een lege string omgezet ging worden, weer wat bijgeleerd, bedankt.

Het is voor in een configuratie in de Postfix mailserver. Er zit dus geen scripting taal tussen, ik kan enkel de querie definiëren.

Met de UNION lijkt mij nog het gemakkelijkste te gaan. In het tweede geval krijg ik dan wel een NULL en pas het resultaat op de tweede plaats, maar dat kan ik met een ORDER en LIMIT opvangen.

Ik heb er nu dit van gemaakt:
SQL:
1
2
3
4
5
SELECT
  (SELECT CONCAT(Destination,"@v") FROM Destinations WHERE Source='gebruiker1@tweakers.net' AND Destination NOT LIKE '%@%') AS o
  UNION
  (SELECT Destination FROM Destinations WHERE Source='gebruiker1@tweakers.net' AND Destination LIKE '%@%') 
ORDER BY o DESC LIMIT 1
Het ziet er niet uit, maar ik denk dat dit wel efficiënter is dan een IF.
0.0006 seconden nu om het uit te voeren, maar ik heb nog niet veel data.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Je hebt nu twee queries nodig. Dat is dus niet zo efficient. Met onderstaande constructie heb je maar 1 query nodig.
SQL:
1
2
3
SELECT 
  IF(INSTR(Destination,'@'),Destination,CONCAT(Destination,'@v')) 
FROM Destinations

[ Voor 1% gewijzigd door Kalentum op 23-03-2009 15:35 . Reden: sql fix ]


Acties:
  • 0 Henk 'm!

  • Tofu
  • Registratie: Maart 2003
  • Laatst online: 05-10-2024
Dat ziet er inderdaad netter uit. Ik dacht dat ik op het INSTR dan nog een count moest gaan toepassen, maar blijkbaar wordt een getal wel naar true omgezet.
Op het eerste zicht geeft die ook snellere tijden. Bedankt rutgerw!
Pagina: 1