Announcement

Collapse
No announcement yet.

Platzhalter für Integer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Platzhalter für Integer

    Hallo zusammen...
    Ich sitze seit einigen Tage am Folgendem Problem:

    Ich habe einen Webservice erstellt der mir mit einem Typisiertem Dataset und einer GetDataByParameters Funktion die dahinterliegene SQL Tabelle nach bestimmten Parametern durchsuchen soll. Die Parameter habe ich in einem gesonderten Klassenobjekt abgelegt und diese ist der eigentliche Eingabewert der WebserviceFunktion. Nun will ich mit einer Testanwendung diese Funktion benutzten und muss die Parameter die ich nicht suchen will mit Platzhaltern füllen also z.B. "gib mir alle zeilen mit Namen X und alle anderen Parameter sind egal", sprich es verlangt nach Platzhaltern was bei einfachen Strings mit "%" gut funktioniert. Allerdings habe ich noch Integerwerte in dieser Tabelle und "%" greift dort als Platzhalter nicht. Also
    SQLCode: WHERE "Spaltename" LIKE "%" gibt mir bei StringSpalten alle Werte wieder, bei IntegerSpalten gibt einen "can not be convertet to int"-Error.
    Von daher die Frage:

    Wie kann man in einer IntegerSpalte die Suchkriterien auf "egal" setzten bzw. was ist bei Integer das gleiche was "%" bei StringSpalten ist? Sprich
    ...
    WHERE ("spaltenname" LIKE "egal welche Zahl") AND...

    Hat jemand vielleicht eine Idee?
    Vielen Dank im vorraus!

  • #2
    Hallo!

    Ich hätte da zwei Lösungen:
    Ab .net 2.0 bzw. C#2.0 gibt es nullable Typen. Für int währe das z.B. "int?".
    Leider kann ich nicht genau sagen ob dieser Typ für deine Anwendung passen ist (seriable). Siehe hierzu Dokumtation.

    Früher (1880) habe ich mir geholfen indem ich den Wert des Integers z.B. in einen für die Abfrage ungültigen Bereich gestellt habe (z.B. 0 oder -1 ) beim Zusammenbau der Abfrage wird hierauf geprüft und der Integerwert gegebenenfalls nicht in die Einschränkung aufgenommen.
    Ist die Lösung mit den ungültigen Bereich keine Lösung, so hilft nur ein zusätzliches Feld in deiner Struktur (z.B. int ParameterA, bool isParameterA).
    Wenn "isParameterA" == true dann Feld ParameterA mit in Abfrage aufnehmen sonst nicht.

    P.S.: Das mit den LIKE läuft nur bei Strings. Evtl. kann man die Where-Klausel so bauen:

    WHERE ((not isParameterA) OR (FeldxyZ = ParameterA)) AND (.....

    mfg
    Thomas

    Comment


    • #3
      Hallo,

      so mache ich das immer - sieht vielleicht auf den ersten Blick 'n büschn putzig aus, aber das ist auch schnell!
      Code:
      Create Table #Test (A varchar(10) not null, B int not null)
      insert into #Test values('ABC', 1)
      insert into #Test values('ACD', 2)
      insert into #Test values('CDE', 3)
      --Variante 1
      declare 
      	@A varchar(10)
      	, @B int
      set @A = null
      set @B = 3
      --
      select * from #Test where A like isnull(@A, '') + '%' and B = isnull(@B, B)
      --Variante 2
      set @A = 'A'
      set @B = null
      --
      select * from #Test where A like isnull(@A, '') + '%' and B = isnull(@B, B)
      --
      drop table #Test
      Gruß
      Olaf

      Comment


      • #4
        Super vielen Dank...
        Ich habe das jetzt allerdings etwas anders gelöst und zwar in dem ich den gesuchten Parameter mit Max und Minwerten erweiter und dann eine Between abfrage ausführe. Sprich in etwa so:

        SELECT * FROM QuellTabelle
        WHERE (Stringwert LIKE @Stringwert) AND....
        AND (ID_Wert BETWEEN @ID_Min AND @ID_Max) AND ...

        Bei angebenen Parametern fülle ich beide Werte (also max und min genau gleich) damit, ansonsten hole ich mir durch eine Abfrage die mir jeweils die höhsten und niedrigsten Werte in der Tabelle zurückgibt und gebe alles zurück was dazwischen liegt. In etwa so:

        If IsNothing(Objekt.ID) Or Objekt.ID= 0 Then

        ID_Min = AdapterID.GetDataMinFunktion_ID.Rows(0).Item(0)
        ID_Max = AdapterID.GetDataMaxFunktion_ID.Rows(0).Item(0)

        Else

        ID_Min = Objekt.ID
        ID_Max = Objekt.ID

        End If

        Trotzdem Danke für eure Tipps!

        Comment

        Working...
        X