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

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
hvad er wildcard for tal til brug i sql-sæ~
Fra : Jesper Fjølner


Dato : 08-10-02 18:21

Jeg har lavet en formular, hvor følgende er et udklip fra
html-koden. Man skal vælge en forfatter og et årstal, og disse
værdier bruges så på siden process.asp vha. request.form(" ")
metoden. Som wildcard for fattere bruger jeg tegnet %. Men når
jeg bruger % som wildcard virker det ikke. Skal der bruges et
andet wildcard når det er et tal??


<form method="POST" action="process.asp">
<p>Forfatter
<select size="1" name="forfatter">
<option selected value="%">Alle forfattere</option>
<option value="Rosenberg">Raben Rosenberg</option>
<option value="Videbech">Poul Videbech</option>
<option value="Linnet">Kristian Linnet</option>
&nbsp;
</select></p>
<p>Publikationsår
<select size="1" name="pubyear">
<option selected value="%">Alle år</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>

SQL-sætningen og variabler ser således ud:
forfatter=request.form("forfatter")
pubyear=request.form("pubyear")
rs.Open "Select * from publikationer WHERE forfatter LIKE '%" &
forfatter & "%' AND pubyear = " & pubyear & " ORDER BY pubyear
desc", conn
   
Det virker med alle kombinationer af forfatter og årstal -
UNDTAGEN når jeg vælger "Alle år". Meget underligt. Kan nogen se
hvad der er galt?
Jeg får denne fejlmeddelelse:

Microsoft OLE DB Provider for ODBC Drivers fejl '80040e07'

[Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer
ikke overens i kriterieudtrykket.

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jens Gyldenkærne Cla~ (08-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-10-02 21:46

Jesper Fjølner skrev:

> Som wildcard for fattere bruger jeg tegnet %. Men når
> jeg bruger % som wildcard virker det ikke. Skal der bruges et
> andet wildcard når det er et tal??

Der er ikke noget jokertegn for tal. Hvis du skal søge på alle
årstal skal du bare fjerne feltet fra WHERE-delen af din sql.
Hvis du har brug for at søge på delmængder af tal kan du bruge
operatorerne =, >, <, <=, >=, <> samt BETWEEN (spørg hvis du er i
tvivl om hvordan de virker).

Du kan evt. benytte IN til at give flere mulige værdier. Så kunne
din select se sådan ud:

<select size="1" name="pubyear">
<option selected value="2000,2001,2002">Alle år</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
</select>

Og i din sqlopbygning:

"SELECT .... WHERE pubyear IN (" & pubyear & ")...

Det er lidt enklere at lave, men det er væsentlig ringere
performancemæssigt - i stedet for at være ligeglad med årstallet
leder søgningen nu efter tre forskellige muligheder under årstal.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Peter Lykkegaard (08-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 08-10-02 22:14

Som svar på skriblerier forfattet af Jens Gyldenkærne Clausen

> "SELECT .... WHERE pubyear IN (" & pubyear & ")...
>
> Det er lidt enklere at lave, men det er væsentlig ringere
> performancemæssigt - i stedet for at være ligeglad med årstallet
> leder søgningen nu efter tre forskellige muligheder under årstal.

"IN" spiller faktisk ganske fornuftigt i forb med MSSQL (hvis der index på
feltet)

mvh/Peter Lykkegaard




Jens Gyldenkærne Cla~ (08-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-10-02 22:31

Peter Lykkegaard skrev:

> "IN" spiller faktisk ganske fornuftigt i forb med MSSQL (hvis
> der index på feltet)

O.k. - så lærte man det. Men nu er der jo tale om Access her.

Uanset hvor godt en database håndterer et søgekriterium vil den
aldrig have sværere ved _ikke_ at skulle håndtere det:

SELECT foo FROM bar WHERE a = x AND b = y

....kan ikke være hurtigere at udføre end

SELECT foo FROM bar WHERE a = x
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Peter Lykkegaard (09-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 09-10-02 11:28

Som svar på skriblerier nedfældet af Jens Gyldenkærne Clausen :

> Peter Lykkegaard skrev:
>
>> "IN" spiller faktisk ganske fornuftigt i forb med MSSQL (hvis
>> der index på feltet)
>
> O.k. - så lærte man det. Men nu er der jo tale om Access her.

Ok, jeg overså fejlmeddelelsen i det oprindelige indlæg

> Uanset hvor godt en database håndterer et søgekriterium vil den
> aldrig have sværere ved _ikke_ at skulle håndtere det:
>
> SELECT foo FROM bar WHERE a = x AND b = y
>
> ...kan ikke være hurtigere at udføre end
>
> SELECT foo FROM bar WHERE a = x

Der er index på a og b
Den første select finder to records
Nummer to finder to mill records
Meget tænkt eksempel

Hvad sker der hvis du stiller den op sådan
SELECT foo FROM bar WHERE b = y AND a = x

mvh/Peter Lykkegaard



Jens Gyldenkærne Cla~ (09-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-10-02 12:12

Peter Lykkegaard skrev:

>> Uanset hvor godt en database håndterer et søgekriterium vil den
>> aldrig have sværere ved _ikke_ at skulle håndtere det:

> Der er index på a og b
> Den første select finder to records
> Nummer to finder to mill records
> Meget tænkt eksempel

Ikke nødvendigvis. Men i det givne tilfælde var der - som jeg har
læst spørgsmålet - tale om et kriterium der passede på alle poster
i tabellen.

SELECT foo FROM bar WHERE b IN (SELECT DISTINCT b FROM bar) giver
ikke rigtig mening, vel (bortset fra at den måske fejler hvis b kan
indeholde null).
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (09-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 09-10-02 12:33

Som svar på skriblerier nedfældet af Jens Gyldenkærne Clausen :

> Peter Lykkegaard skrev:
>
>>> Uanset hvor godt en database håndterer et søgekriterium vil den
>>> aldrig have sværere ved _ikke_ at skulle håndtere det:
>
>> Der er index på a og b
>> Den første select finder to records
>> Nummer to finder to mill records
>> Meget tænkt eksempel
>
> Ikke nødvendigvis. Men i det givne tilfælde var der - som jeg har
> læst spørgsmålet - tale om et kriterium der passede på alle poster
> i tabellen.

Du tænker på alle år?
>
> SELECT foo FROM bar WHERE b IN (SELECT DISTINCT b FROM bar) giver
> ikke rigtig mening, vel (bortset fra at den måske fejler hvis b kan
> indeholde null).

Jeg ville bruge exists i det tilfælde...
Men du har da ret i at det er dobbeltkonfekt

mvh/Peter Lykkegaard



Jens Gyldenkærne Cla~ (09-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-10-02 12:42

Peter Lykkegaard skrev:

>> Ikke nødvendigvis. Men i det givne tilfælde var der - som jeg
>> har læst spørgsmålet - tale om et kriterium der passede på
>> alle poster i tabellen.
>
> Du tænker på alle år?

Ja.

>> SELECT foo FROM bar WHERE b IN (SELECT DISTINCT b FROM bar)
>> giver ikke rigtig mening, vel (bortset fra at den måske
>> fejler hvis b kan indeholde null).
>
> Jeg ville bruge exists i det tilfælde...

I Access? Bortset fra det har jeg også lært at EXISTS er langt
bedre end IN performancemæssigt - i de tilfælde hvor begge kan
bruges.

> Men du har da ret i at det er dobbeltkonfekt

Hvis sætningen havde været:

SELECT foo FROM bar WHERE b IN (SELECT DISTINCT b FROM foobar)

havde det ikke været dobbeltkonfekt. Men det var ikke tilfældet.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jesper Fjølner (09-10-2002)
Kommentar
Fra : Jesper Fjølner


Dato : 09-10-02 21:02

Tak for svaret. Det er dog det ved det at jeg blot angav 3 årstal
for nemheds skyld. I virkeligheden er det 10-15 det drejer sig om.
Det vil nok betyde en større performance-nedgang når det er så
mange.
Hvis jeg nu blot helt skulle udelade anden halvdel af sql-sætningen
når man vælger "alle år" hvordan gør jeg så det?
Teksten "AND pubyear = " vil jo stadig stå der, selv om der ikke
bliver sendt noget tekst fra formularen?

----------------------------------------------
Sql-sætningen var:

Dim conn, rs, requestform, n, forfatter, pubyear
forfatter = request.form("forfatter")
pubyear = request.form("pubyear")

rs.Open "Select * from publikationer WHERE forfatter LIKE '%" &
forfatter & "%' AND pubyear = " & pubyear & " ORDER BY pubyear
desc", conn

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

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


Dato : 10-10-02 10:00

Jesper Fjølner skrev:

> Hvis jeg nu blot helt skulle udelade anden halvdel af
> sql-sætningen når man vælger "alle år" hvordan gør jeg så det?
> Teksten "AND pubyear = " vil jo stadig stå der, selv om der
> ikke bliver sendt noget tekst fra formularen?

Derfor bliver du nødt til at ændre den metode du opbygger din sql-
streng på. Her følger en generel metode:

const selectSQL = "SELECT felt1, felt2, felt3 FROM tabel "
const orderSQL = " ORDER BY felt2"
whereSQL = ""

felt1 = Request.Form("felt1")

If felt1 <> "" Then
   whereSQL = whereSQL & "AND felt1navn = " & quote(felt1) "
End If

felt2 = Request.Form("felt2")

If felt2 <> "" Then
   whereSQL = whereSQL & "AND felt2navn = " & quote(felt2) "
End If

....etc. (hvis det skal være rigtig flot kan man pakke det ind i en
løkke - men det springer vi over her).

If len(WhereSQL) > 0 Then
   whereSQL = "WHERE " & mid(whereSQL, 4)
End If

strSQL = selectSQL & whereSQL & orderSQL
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jesper Fjølner (10-10-2002)
Kommentar
Fra : Jesper Fjølner


Dato : 10-10-02 15:05

Tak for svaret. Jeg er jo en begynder, så det er lidt langhåret, men
det virker fint nu. Jeg vil prøve at bruge dit sidste eksempel når
jeg skal effektivisere koden.

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

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

Månedens bedste
Årets bedste
Sidste års bedste