[SQL] Query filter vraagje

Pagina: 1
Acties:

Onderwerpen


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Sinds kort ben ik de wondere wereld betreden van SQL, helaas loop ik nu (al) vast met iets. Ik gebruik SQL in Microsoft Access 2010.

Het probleem is het volgende; ik heb een lijst met allemaal vliegvelden, zoals hier (een klein deel):

Name
Lagos de Moreno airport ( LOM) - Mexico
Linkoping airport ( LPI) - Sweden
Lappeenranta airport ( LPP) - Finland
Ludhiana airport ( LUH) - India
Lusikisiki airport ( LUJ) - South Africa
Luqa airport ( 995) - Malta
Langgur airport ( LUV) - Indonesia
Luwuk airport ( LUW) - Indonesia
Maryborough airport ( MBH) - Australia (MBH)
Luxembourg airport ( LUX) - Luxembourg
Laval airport ( LVA) - France


Vervolgens wil ik alle vliegvelden uit Sweden, Finland en Mexico eruit halen, en alleen de vliegvelden uit de overige landen laten terugkomen. Voor één land lukt het me nog wel, maar voor meerdere landen krijg ik het maar niet voor elkaar. Het dichtstbijzijnde (of in ieder geval, wat mij het meest logisch leek) is het volgende:

SELECT Location.Name
FROM Location
WHERE Name NOT LIKE IN("*Sweden*", "*Finland*", "*Mexico*")

Helaas pakt ie de NOT LIKE IN() combinatie niet. Enig idee hoe dit op te lossen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zonder like en zonder wildcards. En waarom zoek je op namen in plaats van id's?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 18:43

voodooless

Sound is no voodoo!

Waarom voeg je bij Location geen country ID toe, dan kun je daar makkelijk op filteren in een IN. Anders moet je gewoon dynamisch je query bouwen door middel van een simpel loopje over je landen.

Do diamonds shine on the dark side of the moon :?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt niet zomaar keywords door elkaar mikkeren (Like en IN) en er van uit gaan dat SQL wel snapt wat je bedoelt ;)

Je zult iets moeten doen als:
SQL:
1
2
3
Where name like '*foo*'
 or name like '*bar*'
 or name like '*foobar*'

Eventueel kun je de laatste wildcard weglaten (dus "*foo") als het land altijd achteraan staat (en de string verder geen whitespace of andere rommel aan 't eind bevat en ...) maar "Australia (MBH)" geeft dan weer problemen...

Maar waar ik me meer zorgen over maak is dat je (schijnbaar?) geen losse velden hebt voor deze landinfo.
NMe schreef op donderdag 25 augustus 2011 @ 10:00:
Zonder like en zonder wildcards.
Zonder like/wildcards wordt 't lastig in dit geval ;) Het kan wel...
SQL:
1
2
3
where right(name, 3) = 'foo'
 or right(name, 3) = 'bar'
 or right(name, 6) = 'foobar'

:P

Linksom of rechtsom: dit gaat natuurlijk nooit fatsoenlijk performen. Ik zou dan ook eerst even gaan normaliseren en een fatsoenlijk DB ontwerp bouwen.

[ Voor 69% gewijzigd door RobIII op 25-08-2011 10:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Helaas krijg ik de database zo aangeleverd dat elk vliegveld niet op landen-niveau is georganiseerd.
RobIII schreef op donderdag 25 augustus 2011 @ 10:02:
Je zult iets moeten doen als:
SQL:
1
2
3
Where name like '*foo*'
 or name like '*bar*'
 or name like '*foobar*'

Eventueel kun je de laatste wildcard weglaten (dus "*foo") als het land altijd achteraan staat (en de string verder geen whitespace of andere rommel aan 't eind bevat en ...) maar "Australia (MBH)" geeft dan weer problemen...
Ik heb dit inderdaad geprobeerd, op de volgende wijze:

SQL:
1
2
3
4
5
SELECT Location.Name
FROM Location
WHERE Name LIKE "*Sweden*"
OR Name LIKE "*Finland*"
OR Name LIKE "*Mexico*"


Dit werkt bij mij niet zodra ik meerdere landen ga toevoegen (in dit geval Finland en Mexico). Alleen Sweden brengt hij wel keurig alle Zweedse vliegvelden terug, maar zodra er meerdere landen worden toegevoegd, brengt Access alles terug ipv alleen deze drie landen.

Australië kan ik er eventueel handmatig nog wel uit halen, als de (MBH) op het eind een probleem vormt..

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Stop eens met die like, die dient hier geen enkel doel. Lees mijn vorige post nog eens.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Zoals je suggereerde, zonder like en zonder wildcards, heb ik dat gedaan;

SQL:
1
2
3
SELECT Location.Name
FROM Location
WHERE Name IN("Sweden", "Finland", "Mexico")


Maar hier geeft hij dan niets terug. Ook als je "*Sweden*" zo tikt, returned ie niets..

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 18:43

voodooless

Sound is no voodoo!

Je zegt dat je de database kant en klaar gekregen hebt? Waarom pas je de database niet aan? Maak een extra country tabel, en filter de landen uit het Name veld in Location. Zet de country id's netjes in Location erbij, en je kunt lekker makkelijk filteren.

Do diamonds shine on the dark side of the moon :?


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
JurjenK schreef op donderdag 25 augustus 2011 @ 10:41:
Helaas krijg ik de database zo aangeleverd dat elk vliegveld niet op landen-niveau is georganiseerd.


[...]


Ik heb dit inderdaad geprobeerd, op de volgende wijze:

SQL:
1
2
3
4
5
SELECT Location.Name
FROM Location
WHERE Name LIKE "*Sweden*"
OR Name LIKE "*Finland*"
OR Name LIKE "*Mexico*"


Dit werkt bij mij niet zodra ik meerdere landen ga toevoegen (in dit geval Finland en Mexico). Alleen Sweden brengt hij wel keurig alle Zweedse vliegvelden terug, maar zodra er meerdere landen worden toegevoegd, brengt Access alles terug ipv alleen deze drie landen.

Australië kan ik er eventueel handmatig nog wel uit halen, als de (MBH) op het eind een probleem vormt..
los van het feit dat het natuurlijk niet echt een lekker database ontwerp is, moet je aan het volgende denken:
(volgens mij heb je trouwens je query hierboven verkeerd gequote en bedoelde je:
SQL:
1
2
3
4
5
SELECT Location.Name
FROM Location
WHERE Name NOT LIKE "*Sweden*"
OR Name NOT LIKE "*Finland*"
OR Name NOT LIKE "*Mexico*"

)

simpele logica leert dat "Griekenland" NOT LIKE "Sweden" is, en dus getoond zal worden. simpele logica leert ook dat "Finland" NOT LIKE "Sweden" is, en dus getoond zal worden... m.a.w. voor ieder land geldt dat minimaal 1 van de voorwaarden TRUE is...

you do the math :)

  • Teunis
  • Registratie: December 2001
  • Laatst online: 21:26
P.O. Box schreef op donderdag 25 augustus 2011 @ 11:42:
[...]

SQL:
1
2
3
4
5
SELECT Location.Name
FROM Location
WHERE Name NOT LIKE "*Sweden*"
AND Name NOT LIKE "*Finland*"
AND Name NOT LIKE "*Mexico*"

)
even kleine edit op bovenstaande post
anders komt sweden er gewoon door omdat het niet gelijk is aan Finland ;)

Andere optie is
SQL:
1
2
3
4
5
6
7
8
9
SELECT Location.Name
FROM Location
WHERE 
NOT
(
 (Location.Name  Like '*Sweden') or
 (Location.Name  Like '*Finland') or
 (Location.Name  Like '*Mexico')
)


Afhankelijk hoevaak je dit moet doen kun je overwegen om de tabel aan te passen en deze velden zelf toe te voegen, zodat geheel makkelijker wordt om te filteren.

[ Voor 15% gewijzigd door Teunis op 25-08-2011 11:50 ]

Please nerf Rock, Paper is fine. Sincerely yours, Scissor.
GW2:Teunis.6427


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Teunis schreef op donderdag 25 augustus 2011 @ 11:48:
[...]

even kleine edit op bovenstaande post
anders komt sweden er gewoon door omdat het niet gelijk is aan Finland ;)

Afhankelijk hoevaak je dit moet doen kun je overwegen om de tabel aan te passen en deze velden zelf toe te voegen, zodat geheel makkelijker wordt om te filteren.
zucht... kauw het anders voor...

(edit: nu ik mijn verhaal zo teruglees, kwam het ook niet echt over als een tip, maar meer alsof ik de kant en klare oplossing aandroeg.... dit was niet de bedoeling.... excuus)

[ Voor 17% gewijzigd door P.O. Box op 25-08-2011 11:51 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

JurjenK schreef op donderdag 25 augustus 2011 @ 11:09:
Zoals je suggereerde, zonder like en zonder wildcards, heb ik dat gedaan;
Ik zie net pas dat je een query wil doen op die string met tig verschillende types data erin. Hoezeer zit je hieraan vast? Want hoewel je antwoord in de posts hier boven me staat ga je hier nog meer problemen van ondervinden als je de database niet normaliseert.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • JurjenK
  • Registratie: Juni 2011
  • Laatst online: 13-11-2014
Teunis schreef op donderdag 25 augustus 2011 @ 11:48:

Andere optie is
SQL:
1
2
3
4
5
6
7
8
9
SELECT Location.Name
FROM Location
WHERE 
NOT
(
 (Location.Name  Like '*Sweden') or
 (Location.Name  Like '*Finland') or
 (Location.Name  Like '*Mexico')
)
Thanks, dit heeft heel erg geholpen. Krijg het nu inderdaad voor elkaar om alle landen eruit te filteren die ik eruit wilde filteren (wat er overigens meer dan 3 zijn).
P.O. Box schreef op donderdag 25 augustus 2011 @ 11:42:

simpele logica leert dat "Griekenland" NOT LIKE "Sweden" is, en dus getoond zal worden. simpele logica leert ook dat "Finland" NOT LIKE "Sweden" is, en dus getoond zal worden... m.a.w. voor ieder land geldt dat minimaal 1 van de voorwaarden TRUE is...

you do the math :)
Dit deed wel even m'n ogen openen. ;) Thanks. :)
NMe schreef op donderdag 25 augustus 2011 @ 11:51:
[...]

Ik zie net pas dat je een query wil doen op die string met tig verschillende types data erin. Hoezeer zit je hieraan vast? Want hoewel je antwoord in de posts hier boven me staat ga je hier nog meer problemen van ondervinden als je de database niet normaliseert.
De database die ik krijg aangeleverd is verre van ideaal en clean. In principe kan ik er verder info eruit halen die ik nu eenmalig nodig heb, maar mocht ik 'm in de toekomst vaker nodig hebben, dan is het wellicht een idee om de database een beetje beter in elkaar te draaien.

Overigens bedankt voor alle hulp, wordt erg gewaardeerd! :)
Pagina: 1