|  | 		    
					
        
         
          
         
	
          | |  | MSSQL og søge med LIKE Fra : Joe
 | 
 Dato :  14-07-10 00:29
 | 
 |  | Hej alle I DB eksperter. Jeg har fået et problem med en søgning, som
 jeg ikke helt ved hvordan jeg skal løse.
 
 Problemet er i alt sin enkelthed, at der er forskel på NULL og et
 blankt felt i databasen og det giver nogle problemer, når jeg søger på
 denne måde, WHERE field1 LIKE '%' eller WHERE field1 LIKE ''.
 
 Jeg har en tabel i min database, hvor jeg definere nogle søgekriterier
 og disse søgekriterier parses direkte til SQL'en (det er ikke en
 offentlig side, så jeg er ikke bange for SQL injections). Et felt kan
 f.eks. dermed indeholde "%", "" eller en fast tekst der skal søges
 efter "havelåge".
 
 Når jeg så skal lave et view, der skal fange alle disse søge-
 kriterier, løber jeg ind i et problem for jeg benytter mig af
 ovenstående søgemåde - altså "WHERE field1 LIKE search_field1 AND
 field2 LIKE search_field2" osv. men denne søgning vil aldrig finde
 felter der indeholder NULL.
 
 Jeg ved også godt, at problemet kan løses ved at søge efter NULL -
 altså f.eks. "WHERE field1 LIKE '%' OR field1 IS NULL" men den skal jo
 kun søge på NULL, hvis søge-kriteriet er "%" eller "".
 
 Hvordan kan jeg løse dette problem direkte i SQL'en således, at jeg
 kan lave et view der finder alle rækker - også selvom de er NULL? Jeg
 tror måske at man kan lave en store procedure eller lignende, men det
 har jeg absolut ingen erfaring med, men kan det løse det?
 
 
 |  |  | 
  Torben Simonsen (14-07-2010) 
 
	
          | |  | Kommentar Fra : Torben Simonsen
 | 
 Dato :  14-07-10 11:16
 | 
 |  | Joe <joespam8@gmail.com> writes:
 
 > Hej alle I DB eksperter. Jeg har fået et problem med en søgning, som
 > jeg ikke helt ved hvordan jeg skal løse.
 >
 > Problemet er i alt sin enkelthed, at der er forskel på NULL og et
 > blankt felt i databasen og det giver nogle problemer, når jeg søger på
 > denne måde, WHERE field1 LIKE '%' eller WHERE field1 LIKE ''.
 >
 > Jeg har en tabel i min database, hvor jeg definere nogle søgekriterier
 > og disse søgekriterier parses direkte til SQL'en (det er ikke en
 > offentlig side, så jeg er ikke bange for SQL injections). Et felt kan
 > f.eks. dermed indeholde "%", "" eller en fast tekst der skal søges
 > efter "havelåge".
 >
 > Når jeg så skal lave et view, der skal fange alle disse søge-
 > kriterier, løber jeg ind i et problem for jeg benytter mig af
 > ovenstående søgemåde - altså "WHERE field1 LIKE search_field1 AND
 > field2 LIKE search_field2" osv. men denne søgning vil aldrig finde
 > felter der indeholder NULL.
 >
 > Jeg ved også godt, at problemet kan løses ved at søge efter NULL -
 > altså f.eks. "WHERE field1 LIKE '%' OR field1 IS NULL" men den skal jo
 > kun søge på NULL, hvis søge-kriteriet er "%" eller "".
 >
 > Hvordan kan jeg løse dette problem direkte i SQL'en således, at jeg
 > kan lave et view der finder alle rækker - også selvom de er NULL? Jeg
 > tror måske at man kan lave en store procedure eller lignende, men det
 > har jeg absolut ingen erfaring med, men kan det løse det?
 
 Kig på funktionen COALESCE. Med den kan du lave dine søgninger på denne
 måde:
 
 ....
 WHERE COALESCE(field1, '') LIKE search_field1 AND ...
 
 
 --
 -- Torben.
 
 
 |  |  | 
  Joe (14-07-2010) 
 
	
          | |  | Kommentar Fra : Joe
 | 
 Dato :  14-07-10 04:49
 | 
 |  | > Kig på funktionen COALESCE. Med den kan du lave dine søgninger på denne
 > måde:
 >
 > WHERE COALESCE(field1, '') LIKE search_field1 AND ...
 
 Umiddelbart ser det jo ud til at løse mit problem - endda på nemmeste
 mulige måde uden at der skal ændres ret meget. Jeg er dog ikke sikker
 på, at jeg helt forstår hvorfor, men jeg antager, at NULL værdier
 erstattes med '' (blank) - er det korrekt?
 
 
 |  |  | 
  Torben Simonsen (14-07-2010) 
 
	
          | |  | Kommentar Fra : Torben Simonsen
 | 
 Dato :  14-07-10 13:38
 | 
 |  | Joe <joespam8@gmail.com> writes:
 
 >> Kig på funktionen COALESCE. Med den kan du lave dine søgninger på denne
 >> måde:
 >>
 >> WHERE COALESCE(field1, '') LIKE search_field1 AND ...
 >
 > Umiddelbart ser det jo ud til at løse mit problem - endda på nemmeste
 > mulige måde uden at der skal ændres ret meget. Jeg er dog ikke sikker
 > på, at jeg helt forstår hvorfor, men jeg antager, at NULL værdier
 > erstattes med '' (blank) - er det korrekt?
 
 Ja, det er korrekt. COALESCE(arg1, arg2, arg3, ...) returnerer det
 første af argumenterne, som ikke er NULL. Så COALESCE(field1, '') vil
 returnere field1, hvis den ikke er NULL - og ellers næste argument,
 som vi jo så kan sætte til ''. COALESCE er vist mere eller mindre
 standard-metoden til at håndtere problemer som dit, hvor man vil
 erstatte alle forekomster af NULL med en eller anden default-værdi.
 
 --
 -- Torben.
 
 
 |  |  | 
 |  |