/ 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
Bedste måde at søge efter navne med
Fra : Martin


Dato : 31-07-07 18:04

Sidder lige og overvejer hvad der er bedst at bruge når man skal søge efter

field LIKE '0%'
AND field LIKE '1%'
AND field LIKE '2%'
AND field LIKE '3%'
AND field LIKE '4%'
AND field LIKE '5%'
AND field LIKE '6%'
AND field LIKE '7%'
AND field LIKE '8%'
AND field LIKE '9%'

I denne findes alle med 0-9 i starten af field, men kan dette gøres nemmere?

field LIKE IN (0%,1%,2%...
virker desværre ikke, men ville da være rart hvis det gjorde :)

 
 
Martin (31-07-2007)
Kommentar
Fra : Martin


Dato : 31-07-07 18:04

Martin wrote:
> Sidder lige og overvejer hvad der er bedst at bruge når man skal søge efter
>
> field LIKE '0%'
> AND field LIKE '1%'
> AND field LIKE '2%'
> AND field LIKE '3%'
> AND field LIKE '4%'
> AND field LIKE '5%'
> AND field LIKE '6%'
> AND field LIKE '7%'
> AND field LIKE '8%'
> AND field LIKE '9%'
>
> I denne findes alle med 0-9 i starten af field, men kan dette gøres
> nemmere?
>
> field LIKE IN (0%,1%,2%...
> virker desværre ikke, men ville da være rart hvis det gjorde :)

Glemte lige at sige det er MySQL 4/5 - skulle gerne virke med begge
versioner, da jeg ikke selv styre hvad der ligger på nummer 2 server.

Thorbjørn Ravn Ander~ (31-07-2007)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 31-07-07 19:07

Martin <maaNO@SPAMscandesigns.dk> writes:

> I denne findes alle med 0-9 i starten af field, men kan dette gøres nemmere?

Afhænger af databasen.

Det er også en kunst at opbygge sine ting så man kan søge uden at lave
fulltablescans.
--
Thorbjørn Ravn Andersen

Michael Zedeler (31-07-2007)
Kommentar
Fra : Michael Zedeler


Dato : 31-07-07 23:11

Martin wrote:
> Sidder lige og overvejer hvad der er bedst at bruge når man skal søge efter
>
> field LIKE '0%'
> AND field LIKE '1%'
> AND field LIKE '2%'
> AND field LIKE '3%'
> AND field LIKE '4%'
> AND field LIKE '5%'
> AND field LIKE '6%'
> AND field LIKE '7%'
> AND field LIKE '8%'
> AND field LIKE '9%'
>
> I denne findes alle med 0-9 i starten af field, men kan dette gøres
> nemmere?

De kriterier du har beskrevet ovenfor er umulige at opfylde. Hvis du
skifter AND ud med OR, vil det opføre sig som jeg tror du forventer.

Jeg ville nok foreslå at skifte det hele ud med nogle regulære udtryk:

http://dev.mysql.com/doc/refman/4.1/en/regexp.html

Siden du

Martin (01-08-2007)
Kommentar
Fra : Martin


Dato : 01-08-07 12:32

Michael Zedeler wrote:
> Martin wrote:
>> Sidder lige og overvejer hvad der er bedst at bruge når man skal søge
>> efter
>>
>> field LIKE '0%'
>> AND field LIKE '1%'
>> AND field LIKE '2%'
>> AND field LIKE '3%'
>> AND field LIKE '4%'
>> AND field LIKE '5%'
>> AND field LIKE '6%'
>> AND field LIKE '7%'
>> AND field LIKE '8%'
>> AND field LIKE '9%'
>>
>> I denne findes alle med 0-9 i starten af field, men kan dette gøres
>> nemmere?
>
> De kriterier du har beskrevet ovenfor er umulige at opfylde. Hvis du
> skifter AND ud med OR, vil det opføre sig som jeg tror du forventer.

Nu var ovenstående bare meget hurtigt copy/pasted, og ikke noget jeg har
brugt, men ville bare finde en nemmere løsning til det end de mange
where linjer :) - og der virker Jens G Clausens løsning rigtig godt.

> Jeg ville nok foreslå at skifte det hele ud med nogle regulære udtryk:
>
> http://dev.mysql.com/doc/refman/4.1/en/regexp.html

Denne skal jeg så nok bruge til de resterende ting, nu har jeg alle
bogstaver og tal på plads, men nu mangler jeg selvfølgelig
specialtegnene og her vil jeg bruge regexp motoren.

Martin (01-08-2007)
Kommentar
Fra : Martin


Dato : 01-08-07 12:46

Martin wrote:
> Denne skal jeg så nok bruge til de resterende ting, nu har jeg alle
> bogstaver og tal på plads, men nu mangler jeg selvfølgelig
> specialtegnene og her vil jeg bruge regexp motoren.

Ja.. det har jeg også problemer med.

Jeg vil gerne frem til følgende.

Alle LEFT(title,1) som ikke er alphanumeriske (alnum)

Følgende er afprøvet
LEFT(title,1) RLIKE '^[:alnum:]' // intet resultat
LEFT(title,1) RLIKE '[:alnum:]' // giver masser af forkerte resultater
LEFT(title,1) NOT_REGEXP '[:alnum:]' // giver intet resultat

Jeg har selvfølgelig lavet 2 titler der hedder
"éTest af underligt bogstav"
"äTest af underligt bogstav 2"

En der kan give mig et spark i den rigtige retning? :)

Jens Gyldenkærne Cla~ (01-08-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 01-08-07 13:16

Martin skrev:

> Alle LEFT(title,1) som ikke er alphanumeriske (alnum)


Først og fremmest skal du nok tjekke at du bruger en collation
(sorterings/søgenøgle) der skelner mellem accent og ikke accent
(altså hvor e <> é). Jeg kan ikke huske hvordan man vælger det i
MySQL, men i MSSQL kan man normalt vælge en række
kombinationsmuligheder for hver landespecifik collation - CI/CS
afgør versalfølsomhed (e <> E), AI/AS afgør accentfølsomhed (é <>
e) og endelig er _bin en ren binær sorteringsnøgle.


Regex-mulighederne er måske nok det rigtige valg når de nu er der,
men mindre kan også klare det:

   ... WHERE LEFT(title, 1) NOT BETWEEN '0' AND '9'
       AND LOWER(LEFT(title, 1)) NOT BETWEEN 'a' AND 'z'


Ovenstående kan simplificeres betragteligt hvis man ikke behøver at
tage hensyn til ikke alfanumeriske ascii-tegn (!, ", #, etc.)


   WHERE title > '{'


I begge tilfælde regnes æøå ikke som alfanumeriske tegn. Tegnet {
er valgt fordi det er første tegn der følger efter z.



--
Jens Gyldenkærne Clausen

Martin (01-08-2007)
Kommentar
Fra : Martin


Dato : 01-08-07 13:43

Jens Gyldenkærne Clausen wrote:
> Martin skrev:
>
>> Alle LEFT(title,1) som ikke er alphanumeriske (alnum)
>
>
> Først og fremmest skal du nok tjekke at du bruger en collation
> (sorterings/søgenøgle) der skelner mellem accent og ikke accent
> (altså hvor e <> é). Jeg kan ikke huske hvordan man vælger det i
> MySQL, men i MSSQL kan man normalt vælge en række
> kombinationsmuligheder for hver landespecifik collation - CI/CS
> afgør versalfølsomhed (e <> E), AI/AS afgør accentfølsomhed (é <>
> e) og endelig er _bin en ren binær sorteringsnøgle.

é = e
fandt jeg ud af - jeg har desværre ikke mulighed for at ændre i MySQL
databasen direkte så det problem kan jeg nok ikke løse.

Ligenu bruger tabellen tegnsættet
latin1_swedish_ci

Det eneste jeg kan ændre til (som har noget binært i sig) er latin1_bin
Jeg kan ikke se nogle tegnsæt der hedder noget med CS eller lign.

> Regex-mulighederne er måske nok det rigtige valg når de nu er der,
> men mindre kan også klare det:
>
>    ... WHERE LEFT(title, 1) NOT BETWEEN '0' AND '9'
>        AND LOWER(LEFT(title, 1)) NOT BETWEEN 'a' AND 'z'

Dette virker helt perfekt :)

Jens Gyldenkærne Cla~ (01-08-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 01-08-07 14:45

Martin skrev:

> é = e
> fandt jeg ud af - jeg har desværre ikke mulighed for at ændre
> i MySQL databasen direkte så det problem kan jeg nok ikke
> løse.


Du kan bruge COLLATE i sql-sætningen - se
<http://dev.mysql.com/doc/refman/4.1/en/charset-collate.html>


- det vil dog betyde at et evt. indeks på feltet så ikke kan
benyttes.


> Det eneste jeg kan ændre til (som har noget binært i sig) er
> latin1_bin Jeg kan ikke se nogle tegnsæt der hedder noget med
> CS eller lign.

Navngivningsstrukturen med CS/CI, AS/AI stammer fra MSSQL - og
hedder måske noget andet i MySQL. Det ser dog ud til at MySQL
bruger samme system:
<http://dev.mysql.com/doc/refman/4.1/en/case-sensitivity.html>


>> ... WHERE LEFT(title, 1) NOT BETWEEN '0' AND '9'
>> AND LOWER(LEFT(title, 1)) NOT BETWEEN 'a'
>> AND 'z'
>
> Dette virker helt perfekt :)

Også uden COLLATE?


--
Jens Gyldenkærne Clausen

Martin (03-08-2007)
Kommentar
Fra : Martin


Dato : 03-08-07 10:56

Jens Gyldenkærne Clausen wrote:
> Du kan bruge COLLATE i sql-sætningen - se
> <http://dev.mysql.com/doc/refman/4.1/en/charset-collate.html>
>
>
> - det vil dog betyde at et evt. indeks på feltet så ikke kan
> benyttes.

Ikke så godt - der er pænt mange rækker, og der kommer mange mange om
dagen, så indeks er rimelig vigtigt.

Kunden kan også godt leve med at é = e - så det er ikke det store problem.

>
>
>>> ... WHERE LEFT(title, 1) NOT BETWEEN '0' AND '9'
>>> AND LOWER(LEFT(title, 1)) NOT BETWEEN 'a'
>>> AND 'z'
>> Dette virker helt perfekt :)
>
> Også uden COLLATE?

Nej, é kommer ikke med under "tegn" WHERE klausulen, men det er nu ikke
så vigtigt. Det vigtigste var bare ? @ og . (og andre tegn) da der er
nogle titler med dette :)

Michael Zedeler (02-08-2007)
Kommentar
Fra : Michael Zedeler


Dato : 02-08-07 21:27

Martin wrote:
>
> Denne skal jeg så nok bruge til de resterende ting, nu har jeg alle
> bogstaver og tal på plads, men nu mangler jeg selvfølgelig
> specialtegnene og her vil jeg bruge regexp motoren.

Jeg synes at det virker mere oplagt at bruge regulære udtryk til det
hele, men sådan er der jo så meget...

Jens' forslag med at hive det første tegn ud er jo også rimelig enkelt,
men så skriver du noget om at du får behov for også at lave andre
sammenligninger?

Mvh. Michael.

Martin (03-08-2007)
Kommentar
Fra : Martin


Dato : 03-08-07 10:59

Michael Zedeler wrote:
> Martin wrote:
>>
>> Denne skal jeg så nok bruge til de resterende ting, nu har jeg alle
>> bogstaver og tal på plads, men nu mangler jeg selvfølgelig
>> specialtegnene og her vil jeg bruge regexp motoren.
>
> Jeg synes at det virker mere oplagt at bruge regulære udtryk til det
> hele, men sådan er der jo så meget...
>
> Jens' forslag med at hive det første tegn ud er jo også rimelig enkelt,
> men så skriver du noget om at du får behov for også at lave andre
> sammenligninger?

Jeg har de sammenligner som jeg skal bruge nu - så det er nu ikke mere
end 2 der skulle bruges.

Som du også kan se i et af mine tidligere indlæg, så virker reg exp bare
ikke - eller rettere jeg kan ikke hitte ud af det - også virker Jens'
klausuler meget meget mere overskulige, og er nemme at forstå :)

Jørn Andersen (01-08-2007)
Kommentar
Fra : Jørn Andersen


Dato : 01-08-07 06:10

On Tue, 31 Jul 2007 19:03:34 +0200, Martin <maaNO@SPAMscandesigns.dk>
wrote:

>Sidder lige og overvejer hvad der er bedst at bruge når man skal søge efter
>
>field LIKE '0%'
>AND field LIKE '1%'
>AND field LIKE '2%'
>AND field LIKE '3%'
>AND field LIKE '4%'
>AND field LIKE '5%'
>AND field LIKE '6%'
>AND field LIKE '7%'
>AND field LIKE '8%'
>AND field LIKE '9%'

Du mener sikkert OR

>I denne findes alle med 0-9 i starten af field, men kan dette gøres nemmere?
>
>field LIKE IN (0%,1%,2%...
>virker desværre ikke, men ville da være rart hvis det gjorde :)

Er der ikke en LEFT-funktion i MySql (som i Access) - så kunne du:
.... LEFT([field], 1) IN ("1", "2", "3" ... )

Good luck!

--
Jørn Andersen,
Brønshøj

Jens Gyldenkærne Cla~ (01-08-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 01-08-07 09:58

Jørn Andersen skrev:

>>I denne findes alle med 0-9 i starten af field, men kan dette
>>gøres nemmere?

> Er der ikke en LEFT-funktion i MySql (som i Access) - så kunne
> du: ... LEFT([field], 1) IN ("1", "2", "3" ... )

Det er lettere at udnytte det faktum at 0-9 ligger i rækkefølge -
også i ascii-tabellen:

.... WHERE field BETWEEN '0' AND '9'


--
Jens Gyldenkærne Clausen

Jens Gyldenkærne Cla~ (01-08-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 01-08-07 11:13

Jens Gyldenkærne Clausen skrev:

> Det er lettere at udnytte det faktum at 0-9 ligger i
> rækkefølge - også i ascii-tabellen:
>
> ... WHERE field BETWEEN '0' AND '9'

- rettelse:

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


Uden LEFT finder man fint nok alle poster hvor feltet starter med
0-8, men man finder ikke '99' eller '9 gamle mænd'.


--
Jens Gyldenkærne Clausen

Martin (01-08-2007)
Kommentar
Fra : Martin


Dato : 01-08-07 11:49

Jens Gyldenkærne Clausen wrote:
> ... WHERE LEFT(field, 1) BETWEEN '0' AND '9'

Smart måde... - og det virker :)

Peter Brodersen (15-08-2007)
Kommentar
Fra : Peter Brodersen


Dato : 15-08-07 21:05

On Wed, 01 Aug 2007 12:12:48 +0200, "Jens Gyldenkærne Clausen"
<jens@gyros.invalid> wrote:

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

For MySQL vil LIKE med OR faktisk være hurtigst, hvis der er tale om
et indekseret felt (og der er behov for performance). Indexes bliver
ikke brugt på felter inde i funktioner eller regexp. Heller ikke selv
om der i praksis søges i starten af strengen, hvor et index egentligt
godt kunne blive brugt, fx ved
LEFT(field,1) BETWEEN '0' AND '9'
field REGEXP '^[0-9]'

Til gengæld benytter følgende et index (range):

field LIKE '0%'
OR field LIKE '1%'
OR field LIKE '2%'
OR field LIKE '3%'
OR field LIKE '4%'
OR field LIKE '5%'
OR field LIKE '6%'
OR field LIKE '7%'
OR field LIKE '8%'
OR field LIKE '9%'

Men igen, det afhænger om der er nok indhold til at et index overhovet
er relevant at få på banen.

--
- Peter Brodersen
Kendt fra Internet

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste