|
| 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.
| |
|
|