Announcement

Collapse
No announcement yet.

bitwise AND als Aggregatfunktion

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

  • bitwise AND als Aggregatfunktion

    Ich habe ein Feld mit einem Bitmuster und würde es gerne in einer bestimmten Gruppierung mit allen Werten dieser Spalte bitweise verknüpfen.

    Also als Pseudocode etwa sowas

    [Highlight=SQL]select feld1, bitwiseAND(feld2)
    group by feld1[/Highlight]

    Gibt es da was fertiges für die ~bitweiseAND~ Funktion oder muss ich mir eine schreiben?

  • #2
    Originally posted by Ralf Jansen View Post
    Ich habe ein Feld mit einem Bitmuster und würde es gerne in einer bestimmten Gruppierung mit allen Werten dieser Spalte bitweise verknüpfen.

    Also als Pseudocode etwa sowas

    [Highlight=SQL]select feld1, bitwiseAND(feld2)
    group by feld1[/Highlight]

    Gibt es da was fertiges für die ~bitweiseAND~ Funktion oder muss ich mir eine schreiben?
    Der Operator ist doch "&" oder?

    Dann wäre es
    [HIGHLIGHT=SQL]
    select feld1 & Feld2
    from mytable
    group by feld1 & Feld2
    [/HIGHLIGHT]
    Hab allerdings nicht genau verstanden, was DU nun ANDen willst und was gruppieren.
    Gruß, defo

    Comment


    • #3
      Ich möchte nicht 2 Spalten 1 Zeile verunden sondern alle Werte eine Spalte.

      Testdata
      Code:
      Feld 1   Feld 2
      -----------------
            1    0110 (6)
            1    0011 (3)
            1    0101 (5)
      -----------------
            1    0111 (7)  = Ergebnis

      Edit : Meine Lösung sähe gerade so aus.

      [Highlight=SQL]select Feld1,
      sign(sum(Feld2 & 1)) * 1 +
      sign(sum(Feld2 & 2)) * 2 +
      sign(sum(Feld2 & 4)) * 4 +
      sign(sum(Feld2 & 8)) * 8
      from Table
      group By Feld1[/Highlight]

      Handlich ist das aber nicht gerade. Und wie könnte man das in eine Stored Function packen

      Comment


      • #4
        Hallo Ralf,
        also bei mir würde bei deinem Beispiel und einem bitweisen UND 0000 rauskommen! Dein Ergebnis passt eher zu einem ODER!
        Bei MySQL gibts dafür BIT_AND() bzw. BIT_OR(), sieht aber so aus als ob der MSSQL etwas in der Art nicht kennt.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Du weist offenbar besser was ich will als ich selber Gut erkannt. Ja sollte eigentlich ein bitweises Oder (meine obige Lösung zum Beispiel ist auch ein bitwise OR) sein.

          Comment


          • #6
            Hab mich mal schlaugemacht. Eine eigene Aggregatfunktion zu schreiben die das kapselt scheint nur in CLR möglich zu sein. CLR für diesen Server einzuschalten ist aber leider keine Option. Muss halt doch obige ~inline~ Lösung ohne schöne Kapselung in eine Funktion herhalten. Falls jemand eine andere Idee hat oder eine Möglichkeit sieht das als Stored Function (funktionierend ) zu kapseln würde ich mich freuen die zu hören.

            Comment


            • #7
              Das lässt sich relativ einfach in einer stored proc oder genauso in einer UDF verwirklichen. Etwa so:


              declare @tmp table (
              lfd int identity(1,1),
              wert int )

              declare
              @x int,
              @ergebnis int

              insert into @tmp(wert) select feld2 from tabelle
              select @x = 2, @ergebnis = wert from @tmp where lfd = 1

              while @x <= (select max(lfd) from @tmp) begin
              select @ergebnis = @ergebnis | wert from @tmp where lfd = @x
              set @x = @x + 1
              end

              return @ergebnis


              (ungetestet!)

              bye,
              Helmut

              Comment

              Working...
              X