Avatar billede Jman Praktikant
23. januar 2003 - 08:39 Der er 34 kommentarer og
1 løsning

LIKE, men kun på en del af tekststrengen

Hejsa!
Jeg har lavet en asp-side, hvor man har forskellige selections. Men nu løber jeg ind i et problem m.h.t. søgestrengen. Er der ikke noget med at man kan lave denne sætning:

strSQL = "Select * FROM SIDETID WHERE (TEXT LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis")
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"

om, så man kun laver en select på de 3 sidste karakterer ?
Avatar billede dk_akj Nybegynder
23. januar 2003 - 09:20 #1
Kan du ikke forklare lidt nærmere hvad du vil ??
Vil du have vist de sidste 3 chars eller kun have vist poster hvor de sidste 3 chars opfylder søgekriteriet ??

Hvilken database ?

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 09:27 #2
det er en oracle database. nedenfor er et par eksempler på hvad der kan stå i feltet:

001_s1O <- bemærk at dette er stort "O"
012_s10 <- bemærk dette er et nul-tal
001_14V
014_s5O

Hvis man ser på de sidste to eksempler kan jeg ikke nøjes med at selecte LIKE på hele strengen, hvis jeg eksempelvis søger på 14. Jeg vil kun hav dem, der opfylder kravet på de sidste 3 karakterer (altså hvor der er '14' efter underscoren)
Avatar billede dk_akj Nybegynder
23. januar 2003 - 09:41 #3
Denne sql giver dig text og en compute af text der giver dig de sidste 3 chars:
  SELECT "TEXT" , substr("TEXT", length( "TEXT" ) - 2 ,length( "TEXT" ))
    FROM "SIDETID" 
;

Denne sql skulle så kun vise de ønskede poster:
strSQL = "Select * FROM SIDETID WHERE (substr("TEXT", length( "TEXT" ) - 2 ,length( "TEXT" )) LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis")
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"


//akj
Avatar billede eagleeye Praktikant
23. januar 2003 - 09:42 #4
Hvis det altid er de sidte 3 karakter så prøv at tilføje right(kolonnenavn,3)


right(TEXT,3)
Avatar billede dk_akj Nybegynder
23. januar 2003 - 09:45 #5
Oracle har ingen right funktion :-(
Derfor er man nødt til at bruge substring.

//akj
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 09:50 #6
Du skal bare sætte dine to eksempler sammen:

SELECT * FROM SIDETID WHERE
    substr("TEXT", length( "TEXT" ) - 2 ,length( "TEXT" )) LIKE '%" & request("avis")

... og så videre ...
Avatar billede dk_akj Nybegynder
23. januar 2003 - 09:55 #7
darkstar >> er det ikke lige det jeg har skrevet ???

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 10:05 #8
dk_akj - den viser stadig for meget. Hvis jeg selecter med din sql og vil søge på alt der hedder xxx_014 (så bliver min select til ...Where TEXT like 14...) men jeg får stadig tekststrenge, der indeholder 014_xxx..

eagleeye: Jeg får invalid column name:
strSQL = "Select * FROM SIDETID WHERE (right(TEXT,3) LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis")
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"
Avatar billede dk_akj Nybegynder
23. januar 2003 - 10:09 #9
det er fordi du laver en OR prøv

strSQL = "Select * FROM SIDETID WHERE upper((substr("TEXT", length( "TEXT" ) - 2 ,length( "TEXT" )) LIKE upper('%" & request("avis"))
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 10:35 #10
hmm ....
Expected end of statement

browseren "peger" på T i ....upper((substr("TEXT",....
Avatar billede dk_akj Nybegynder
23. januar 2003 - 10:46 #11
Jeg har lige testet :o)

Select
    text,substr("TEXT", length( "TEXT" ) - 2 ,length( "TEXT" )) FROM SIDETID
where
    upper (substr("TEXT", length( "TEXT" ) - 2 ,length( "TEXT" ))) like upper('%14%')
;

Denne sql giver en record "001_14V" med flg data i tabellen:
001_s1O
012_s10
001_14V
014_s5O

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 10:50 #12
ja, men det er desværre også forkert -
Hvis den, som i dit eksempel skal søge på noget der ligner '14', må kun
001_14V komme frem
Avatar billede dk_akj Nybegynder
23. januar 2003 - 10:51 #13
Det gør den også.

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 11:12 #14
vrææææl.... :(
nu har jeg erstattet * med de felter, jeg egentlig skal bruge.. men jeg får stadig
Expected end of statement
Poster lige min kode, som den ser ud nu:
strSQL = "Select substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' )), TIMESTAMP, EVENT, STATIONID, IDLETIME FROM SIDETID WHERE upper((substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' ))) LIKE upper('%" & request("avis"))
Avatar billede dk_akj Nybegynder
23. januar 2003 - 11:45 #15
strSQL = "Select substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' )), TIMESTAMP, EVENT, STATIONID, IDLETIME FROM SIDETID WHERE upper((substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' ))) LIKE upper('%" & request("avis") & ")"

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 12:14 #16
jeg hæver lige point, for din hjælpsomhed (og min dumhed) men jeg kan ikke finde min nye fejl...
[Oracle][ODBC][Ora]ORA-00907: missing right parenthesis
Avatar billede dk_akj Nybegynder
23. januar 2003 - 12:16 #17
Prøv lige at lave en response.write på strSQL og post resultatet her.

//akj
Avatar billede dk_akj Nybegynder
23. januar 2003 - 12:18 #18
Jeg har fjernet 1 "(" efter upper.

//akj


strSQL = "Select substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' )), TIMESTAMP, EVENT, STATIONID, IDLETIME FROM SIDETID WHERE upper(substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' ))) LIKE upper('%" & request("avis") & ")"
Avatar billede Jman Praktikant
23. januar 2003 - 12:21 #19
Select substr('TEXT', length( 'TEXT' ) - 2, length( 'TEXT' )), TIMESTAMP, EVENT, STATIONID, IDLETIME FROM SIDETID WHERE upper((substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' ))) LIKE upper('%14)%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '15-01-2003' and '19-01-2003' order by TEXT, Timestamp
Avatar billede wiuff Nybegynder
23. januar 2003 - 12:27 #20
Skulle: LIKE upper('%" & request("avis") & ")"
Ikke hedde: LIKE upper('%" & request("avis") & "')"

Men anyways... lige en side note. Lad nu være med at sætte request strengen direkte ind i din SQL. Her ville f.eks.
http://minserver.dk/script.asp?avis='%20%SHUTDOWN();
... nok kunne være en irriterende ting. (Eller noget i din stil).
Avatar billede dk_akj Nybegynder
23. januar 2003 - 12:27 #21
Der er også noget galt her:
LIKE upper('%14)%') and
det skal være
LIKE upper('%14%') and


//akj
Avatar billede Jman Praktikant
23. januar 2003 - 12:32 #22
yup - det rettede sig selv med den parantes, du fjernede. Den eksverer fint nu,  men jeg får ingen resultat af søgning..
Hvis jeg bruger min gamle søgning får jeg 60+ poster

Select substr('TEXT', length( 'TEXT' ) - 2, length( 'TEXT' )), TIMESTAMP, EVENT, STATIONID, IDLETIME FROM SIDETID WHERE upper(substr('TEXT', length( 'TEXT' ) - 2 ,length( 'TEXT' ))) LIKE upper('%14%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '15-01-2003' and '19-01-2003' order by TEXT, Timestamp
Avatar billede dk_akj Nybegynder
23. januar 2003 - 12:36 #23
Det er garanteret fordi den søger %14% i et virtuelt felt der indeholder 14V den vil ikke blive fundet da du jo har en % foran 14.

Løsningen kunne være at ændre fra 2 til 3 i substring funktionen, så vil det virtuelle felt være "-14V".

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 12:50 #24
ja, se så er det jeg løber ind i et andet problem. Det er nemlig således at man f.eks. skal kunne søge på enten 14V eller 14O eller begge (altså blot 14)
Avatar billede dk_akj Nybegynder
23. januar 2003 - 13:07 #25
Jeg tror faktisk vi har lavet det mere indviklet end nødvendigt.

Hvad med:

  SELECT * 
    FROM SIDETID 
  WHERE instr("TEXT", '14' ) > instr("TEXT", '_' )  ;

altså alle rækker hvor der findes 14 men det skal være efter _

//akj
Avatar billede arnvig Nybegynder
23. januar 2003 - 13:17 #26
hvis alle TEXT har formattet xxx_xxx kan det laves endnu simplere

WHERE instr("TEXT", request("avis") ) > 4 ;
Avatar billede Jman Praktikant
23. januar 2003 - 13:36 #27
jeg kan se ideen, og synes det ser godt ud, men får det bare ikke til at virke...
strSQL = "Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME  FROM SIDETID WHERE instr('TEXT', request('avis')) > 4"
strSQL = strSQL & " and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"

giver

Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE instr('TEXT', request('avis')) > 4 and to_char(timestamp,'DD-MM-YYYY') BETWEEN '15-01-2003' and '19-01-2003' order by TEXT, Timestamp
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Oracle][ODBC][Ora]ORA-00904: invalid column name

/prepres/avisprod/sidetid/sidetider.asp, line 108
Avatar billede dk_akj Nybegynder
23. januar 2003 - 13:38 #28
ret:
WHERE instr('TEXT', request('avis')) > 4"
til
WHERE instr(TEXT, request('avis')) > 4"

//akj
Avatar billede dk_akj Nybegynder
23. januar 2003 - 13:40 #29
nej.... ret:
WHERE instr('TEXT', request('avis')) > 4"
til
WHERE instr(TEXT,'" &  request('avis')  & "' ) > 4"

//akj
Avatar billede Jman Praktikant
23. januar 2003 - 13:49 #30
Det virkede sgu - En million, millard tak for hjælpen
Avatar billede Jman Praktikant
23. januar 2003 - 13:50 #31
og det var så den forkerte der fik point ...2 sek
Avatar billede Jman Praktikant
23. januar 2003 - 13:53 #32
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 13:57 #33
superior>> Jeg fik 60 points for at gentage hvad dk_akj lige havde skrevet.
Vil du ikke have dem tilbage?
Avatar billede Jman Praktikant
27. januar 2003 - 21:29 #34
jo tak :)
Avatar billede _darkstar_ Nybegynder
27. januar 2003 - 23:49 #35
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester