[SQL] Titels die beginnen met nummers/symbolen selecteren*

Pagina: 1
Acties:
  • 216 views sinds 30-01-2008
  • Reageer

  • kmf
  • Registratie: November 2000
  • Niet online
Een query-probleempje wat ik niet efficient kan oplossen zo 1,2,3.

Misschien dat anderen dat wel weten.

Ik heb een navigatiesysteem dat navigeert op alfabet.

voor a heb ik dus
Select * from titles where title like 'a%'
en ga zo maar door tot z.

Maar ik heb ook een aantal titles die beginnen met een cijfer 2v 3t, etc.

Wat is dan een goede query hiervoor?
Dit is natuurlijk mogleijk

Select * from titles where
title not like 'a%'
AND title not like 'b%'
AND title not like 'c%'
AND title not like 'd%'

en ga zo maar door, maar dit is natuurlijk niet lekker... iemand die een betere weet?

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


  • momania
  • Registratie: Mei 2000
  • Laatst online: 21-12 13:32

momania

iPhone 30! Bam!

select * from titles where title like '1%'
etc.

:?

Neem je whisky mee, is het te weinig... *zucht*


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:41
code:
1
2
3
4
5
Select * from titles where
title not like 'a%'
AND title not like 'b%'
AND title not like 'c%'
AND title not like 'd%'

Da's inefficient. Een not like is zowiezo al een dure operatie, omdat indexen in de meeste DBMS'en dan niet gebruikt worden.

En wat momania zegt: waarom niet gewoon like '1%' ?

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 21-12 13:32

momania

iPhone 30! Bam!

whoami schreef op zondag 13 november 2005 @ 16:39:
Da's inefficient. Een not like is zowiezo al een dure operatie, omdat indexen in de meeste DBMS'en dan niet gebruikt worden.
Idd, vaak is het makkelijker om er een simpele 'categorie' tabel naast te zetten, waar je 1 t/m 10 en a t/m z in zet en dat linkt aan je titles.
Dan kan je zoiets doen:

SQL:
1
select t.* from titles t, categories c where t.cat_id = c.id and c.cat = 'a'

Dan ben je iig die vreselijke like kwijt.

Wil je echt gaan zoeken, dus anders dan alleen maar op begin letter, dan ontkom je vaak niet aan de like idd, maar vermijden is vaak wel prettig en lekker snel :)
(afhankelijk van welke dbms en groote van tabel inhoud natuurlijk ;) )

[ Voor 4% gewijzigd door momania op 13-11-2005 16:44 ]

Neem je whisky mee, is het te weinig... *zucht*


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:41
De LIKE op zich is niet zo erg: het DBMS kan indexen gebruiken als je een LIKE doet (maar dan moeten je wildcards wel niet eerst staan)
ik bedoel:
hiermee kunnen indexen gebruikt worden:
code:
1
like 'a%'

met deze code niet:
code:
1
like '%a'


Het is de NOT LIKE die lelijk is; bij mijn weten gebruikt een NOT LIKE 'a%' geen indexen.

https://fgheysels.github.io/


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 17:18

The Eagle

I wear my sunglasses at night

Ligt er een klein beetje aan welke DB je gebruikt, en of eerst de letters of eerst de cijfers geparsed worden. In jouw geval gok ik eerst de cijfers; daarom
* The Eagle eensch is met momania en whoami

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • momania
  • Registratie: Mei 2000
  • Laatst online: 21-12 13:32

momania

iPhone 30! Bam!

whoami schreef op zondag 13 november 2005 @ 16:47:
bij mijn weten gebruikt een NOT LIKE 'a%' geen indexen.
Aha zo :)

Heb me er nooit zo in verdiept, maar klinkt wel logisch :)

Neem je whisky mee, is het te weinig... *zucht*


  • kmf
  • Registratie: November 2000
  • Niet online
momania schreef op zondag 13 november 2005 @ 16:36:
select * from titles where title like '1%'
etc.

:?
Ik heb net ook de like #% gebruikt, maar dan krijg ik alsnog

select * from titles where
title like '1%'
AND title like '2%'

en ga zo maar door tot 0. Maar dat lijkt me ook niet echt een lekkere query... zeker omdat ik dan ook symbolen niet mee krijgt. Een @blblab bv.

[ Voor 13% gewijzigd door kmf op 13-11-2005 17:02 ]

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


  • Knutselsmurf
  • Registratie: December 2000
  • Nu online

Knutselsmurf

LED's make things better

athlonkmf schreef op zondag 13 november 2005 @ 17:02:
[...]


Ik heb net ook de like #% gebruikt, maar dan krijg ik alsnog

select * from titles where
title like '1%'
AND title like '2%'

en ga zo maar door tot 0. Maar dat lijkt me ook niet echt een lekkere query... zeker omdat ik dan ook symbolen niet mee krijgt. Een @blblab bv.
En dat gaat zeker nooit werken :)
Als de titel begint met een 1 en de titel begint met een 2 en .....

Maak daar eerst maar eens een OR van :)

[ Voor 3% gewijzigd door Knutselsmurf op 13-11-2005 17:05 ]

- This line is intentionally left blank -


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-12 22:52
Ik kan nog twee andere opties bedenken. Ten eerste een query met een regular expression (maar niet alle databases ondersteunen dat en bovendien is het de vraag of er dan op een handige manier van een index gebruik gemaakt wordt). Ten tweede een string comparison: SELECT * FROM titles WHERE title >= '1' AND title <= '9x' (en in plaats van die 'x' liever een karakter dat zo hoog mogelijk in je collation sequence zit); die gebruikt vrijwel zeker een index.

De efficiënste manier moet je zelf maar even bepalen door de drie opties door een query analyzer te halen. Als ze geen van drie efficiënt zijn zul je toch je datamodel moeten aanpassen. (MIsschien een aparte view bouwen waarin je groepeert op eerste karakter.)

[ Voor 35% gewijzigd door Soultaker op 13-11-2005 17:09 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-12 19:09

NMe

Quia Ego Sic Dico.

Als je met MySQL werkt kun je natuurlijk ook regular expressions gebruiken, zoals Soultaker al zegt. Veel andere opties dan dat en inderdaad stringvergelijkingen zitten er niet echt op ben ik bang.

Titlefix trouwens. :)

'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.


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

In mssql is onderstaande ook gewoon mogelijk. Geen idee of dat 'common' sql is.
code:
1
2
-- selecteer alle titels die met een cijfer starten 
SELECT * FROM tabel WHERE titel LIKE '[0-9]%'

[ Voor 9% gewijzigd door Annie op 13-11-2005 19:31 ]

Today's subliminal thought is:

Pagina: 1