/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MySQL] finde alle med numre ?
Fra : Ukendt


Dato : 20-12-02 18:05

Hejsa gruppe...

Simpelt spørgsmål for engangs skyld

Sådan her finder man alle med B som første bogstav
SELECT artist,title,dato,uploaded_by FROM tekster WHERE artist LIKE
'b%'

Hvordan finder man så alle der indeholder 0-9 ?
Man kunne jo køre dem igennem:

SELECT artist,title,dato,uploaded_by FROM tekster WHERE artist
LIKE '0%' OE LIKE '1%' OR LIKE '2%'..... osv

Men er der ikk en anden og hurtigere løsning ?

 
 
Peter Brodersen (21-12-2002)
Kommentar
Fra : Peter Brodersen


Dato : 21-12-02 04:55

On Fri, 20 Dec 2002 18:04:41 +0100, -Martin-
<martin_aarhof(AT)hotmail.com> wrote:

>Men er der ikk en anden og hurtigere løsning ?

Du kan bruge regulære udtryk. Fx:

... WHERE artist REGEXP '^[0-9]';

Ovenstående betyder, at artist skal begynde med 0, 1, 2, 3, 4, 5, 6,
7, 8 eller 9. Hvis du også vil have "b" med som muligt
begyndelsesbogstav, kan det let tilføjes:

... WHERE artist REGEXP '^[0-9b]';

REGEXP-funktionen gør ikke forskel på små og store bogstaver for
tekstfelter.

Regulære udtryk er, blandt en del andre steder, dokumenteret her:
http://www.mysql.com/documentation/mysql/bychapter/manual_Regexp.html#Regexp


Hvis du blot skal have alle dem, der begynder med et tal fra 1-9 (ikke
0, medmindre, det er efterfulgt af et højere tal), så er en
quick'n'dirty løsning bare:
... WHERE artist;

Men det er nok ikke det, du er interesseret i.

--
- Peter Brodersen

Jens Gyldenkærne Cla~ (21-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 21-12-02 12:55

Peter Brodersen skrev:

> Du kan bruge regulære udtryk. Fx:
>
> .. WHERE artist REGEXP '^[0-9]';

Elegant. I databaser der ikke understøtter regexp-funktionen kan
det klares med left (der vist findes i alle almindelige databaser):

... WHERE LEFT(artist, 1) BETWEEN '0' AND '9'
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Peter Brodersen (21-12-2002)
Kommentar
Fra : Peter Brodersen


Dato : 21-12-02 13:54

On Sat, 21 Dec 2002 12:54:41 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>.. WHERE LEFT(artist, 1) BETWEEN '0' AND '9'

... hvilket sikkert egentligt også er et hurtigere alterantiv, hvis det
er en databaseserver med temmeligt meget pres på. Og nok tilsvarende
mere læsbart, hvis man ikke er vant til at rode med SQL og regulære
udtryk.

--
- Peter Brodersen

Peter Brodersen (16-01-2003)
Kommentar
Fra : Peter Brodersen


Dato : 16-01-03 09:38

On Sat, 21 Dec 2002 13:54:01 +0100, Peter Brodersen <usenet@ter.dk>
wrote:

>>.. WHERE LEFT(artist, 1) BETWEEN '0' AND '9'
>.. hvilket sikkert egentligt også er et hurtigere alterantiv, hvis det
>er en databaseserver med temmeligt meget pres på. Og nok tilsvarende
>mere læsbart, hvis man ikke er vant til at rode med SQL og regulære
>udtryk.

.... vælter lige tilbage i denne tråd.

Der var en lignende diskussion på et tidspunkt angående at bruge
LEFT(felt,1) = "x" i stedet for LIKE "x%", hvor jeg umiddelbart ville
tro at LEFT-eksemplet var det hurtigste.

At dømme på en explain i MySQL, så er LIKE rent faktisk at foretrække,
hvis man har index på feltet - og man altså skal finde første del af
en string. Fra en tilfældig tabel med index på "title"-feltet:

mysql> explain SELECT id FROM bog WHERE title LIKE "a%";
+-------+-------+---------------+-------+---------+------+------+------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+-------+---------------+-------+---------+------+------+------------+
| bog | range | title | title | 200 | NULL | 112 | where used |
+-------+-------+---------------+-------+---------+------+------+------------+
1 row in set (0.00 sec)

mysql> explain SELECT id FROM bog WHERE LEFT(title,1) = "a";
+-------+------+---------------+------+---------+------+------+------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+------+---------+------+------+------------+
| bog | ALL | NULL | NULL | NULL | NULL | 1943 | where used |
+-------+------+---------------+------+---------+------+------+------------+
1 row in set (0.00 sec)

"title"-feltet er i dette tilfælde et varchar-felt, men jeg oplever
det samme på almindelige tekstfelter.

Det skal dog siges, at det ikke lader til at REGEXP-søgninger på fx
"^a" kan benytte sig af indexet.

--
- Peter Brodersen

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste