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

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