Results 1 to 9 of 9

Thread: Zoeken naar leeg veld

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    Zoeken naar leeg veld

    Ik gebruik een TIBSQL met een parameter om te zoeken naar een veld.

    Dit is de sql:

    Code:
    SELECT omschrijving FROM transactie
    WHERE omschrijving = :par_omschrijving
    En dit is de code om te zoeken
    Code:
    SQL.Params.ByName('par_omschrijving').AsString := '';
    SQL.ExecQuery;
    (Geinig die smiley... dubbele punt dus)

    Bij een gevulde string geeft de sql netjes het goede record maar als de string leeg is wil ik dat ie ook de <NULL> records vindt en dat doet ie niet.
    GEEN oplossing is (wat mij betreft) alle NULL-velden te vullen met een lege string.

    Hoe kan ik er nu voor zorgen dat ie altijd het goede resultaat teruggeeft
    Als ik zoek naar een leeg omschrijvingsveld wil ik dat natuurlijk ook kunnen vinden.
    Leeg EN/OF NULL dus.
    Last edited by Dees; 21-Sep-04 at 01:13.

  2. #2
    Code:
    SELECT omschrijving FROM transactie
    WHERE omschrijving = :par_omschrijving OR 
      omschrijving is null
    Gewoon kijken of je veld isnull is.


    *Disable smilies in post hierboven


  3. #3
    Counting your refs Paul-Jan's Avatar
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,160
    In sommige situaties (niet de hier beschreven, maar wel in aanverwante) kan het soms nuttig zijn om de COALESCE (of ISNULL, of wat ook de Ib variant hiervan moge zijn) te gebruiken. Vooral wanneer je strings bij elkaar op wilt tellen, ter illustratie:

    Code:
    select
      coalesce( firstName, '' ) + ' ' + coalesce( lastname, '' )
    from
      person
    (ja dit vult de kolom met teveel spaties als firstName of lastName null is, ter illustratie zei ik

  4. #4
    Je schrijft dat je per sé NULL als lege string wilt gebruiken, maar dat is een denkfout in de theorie van relationele databases.

    NULL geeft een "toestand" van een veld aan, en niet een "waarde". Parameters van queries nemen alleen waarden aan als waarde, en niet toestanden. Immers de parameter zelf kent ook een toestand (wel of geen waarde gegeven).

    Het is een goede gewoonte om NULL alleen te gebruiken wanneer je (nog) niet weet wat de waarde is. Als je spreekt over een lege string dan is dat de waarde: ''.
    Als je bijvoorbeeld gewicht als veld hebt, dan krijgt géén gewicht de waarde 0.

    Je kunt één en ander eenvoudig implementeren door de kolom omschrijving te definiëren als NOT NULL en DEFAULT '';

    Kennelijk zit je nu vast aan een ontwerpvergissing. In de oplossing van Dees krijg je altijd alle records waarvan de omschrijving NULL is, ook als je par_omschrijving een waarde hebt geven. Wanneer je of records met een specifieke veldwaarde voor omschrijving wilt terugkrijgen, of alleen records waarin het veld omschrijving nog geen waarde is toegekend, dan zul je voor het laatste geval een extra query moeten gebruiken:
    Code:
    SELECT *
    FROM transacties
    WHERE omschrijving IS NULL;
    Ik gebruik voor de vorm maar een asterisk; een omschrijving opvragen die je er zelf in stopt heeft weinig zin.
    Als je DBMS het toestaat kun je het probleem ook oplossen met één stored procedure.

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Mijn omschrijvingveld mag gewoon leeg zijn, dus NOT NULL is geen optie.

    En dit werkt dus niet:
    Parameter NULL of Unassigned werkt ook niet

    Code:
       const
         SFindTransactie =
          'SELECT ' +
            'omschrijving ' +
          'FROM transactie ' +
          'WHERE ' +
            'omschrijving = :omschrijving';
    
        with QryFindTransactie do
        begin
          SQL.Text := SFindTransactie;
          Params.ByName('omschrijving').AsString := Rec.omschrijving;
          ExecQuery;
        end;
    Wie o wie weet wat te doen?
    Last edited by PsychoMark; 22-Sep-04 at 00:39.

  6. #6
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Oeps: NULL werkt wel.
    Probleem opgelost dus.
    De oplossing:

    Code:
      const SQryFindTransactieSQL =
        'SELECT ' +
          'omschrijving ' +
        'FROM transactie ' +
        'WHERE ' +
          '((omschrijving = :omschrijving) or (omschrijving is null AND :omschrijving = ""))';

    Code:
    with QryFindTransactie do
      begin
        SQL.Text := SFindTransactie;
        if Rec.Omschrijving = '' then 
          Params.ByName('omschrijving').Value := NULL
        else 
          Params.ByName('omschrijving').AsString := Rec.omschrijving;
        ExecQuery;
      end;
    Last edited by PsychoMark; 22-Sep-04 at 00:39.

  7. #7
    Ik kan me niet voorstellen dat deze query iets zinvols oplevert.

    Je vraagt om records met een omschrijving die beantwoordt aan de
    waarde van een parameter (dus niet NULL) die je zelf al opgeeft, én de records waarvan de omschrijving '' is en tegelijkertijd ook geen waarde heeft.
    Je selecteert alleen de kolom omschrijving. Wat is de zin van deze exercitie, afgezien van het gegeven dat where clause van de query niet klopt?

    Code:
    'SELECT ' +
          'omschrijving ' +
        'FROM transactie ' +
        'WHERE ' +
          '(omschrijving = :omschrijving) or (omschrijving is null) OR (omschrijving = "")';

  8. #8
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    De query is slechts bedoeld om uit te vinden of een record bestaat, gebaseerd op een importrecord uit een CSV-bestand.
    Hij leek het te doen maar het ziet er inderdaad onlogisch uit.
    Ik ga nog ff checken vandaag.

  9. #9
    Hoi,

    Zoals Elphi al aangeeft is een NULL een status en geen waarde. In jouw geval kun je dus beter een trigger maken die bij het invoegen/updaten van een NULL status een lege waarde in het veld zet, daarmee komt er nooit een NULL status voor. Daarbij kun je ook nog de kolom als NOT NULL definieeren om zeker te weten dat deze nooit een NULL status zal bevatten.

    Groeten,
    Arno
    Nederlandse Firebird Nieuwsgroep
    Hoe meer je weet, hoe meer je beseft hoe weinig je weet.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Van pag1, naar pag2, naar pag3, naar pag1
    By Matrix in forum WebDelphi
    Replies: 10
    Last Post: 30-Nov-04, 11:30
  2. zoeken naar een zoveelste witregel
    By TheJ in forum Algemeen
    Replies: 11
    Last Post: 29-May-04, 20:11
  3. Replies: 9
    Last Post: 13-Feb-04, 15:20
  4. Zoeken met SQL naar ??,?ñ,? ??
    By Maiko in forum Algemeen
    Replies: 1
    Last Post: 25-Nov-01, 14:50
  5. Replies: 8
    Last Post: 29-May-01, 12:48

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •