![]() |
Datenbank: MS Access • Version: 2003 • Zugriff über: ADO
SQL ORDER BY mit Bitoperation
Hallo!
Vielleicht kann mir jemand bei folgendem Problem helfen. Eine MS Access-Datenbank mit einer Tabelle namens BENUTZER mit drei Feldern. 1. ID 2. Benutzer 3. Berechtigung (Bit 1-Admin, Bit 2-Benutzer, Bit 3-Programmierer) - Mehrfachnennung möglich! Die Abfrage funktioniert bezüglich der Bitoperationen wie gewünscht:
Code:
Jetzt bräuchte ich in dieser Abfrage allerdings auch eine zusätzliche Spalte Sortierung anhand die abgefragten Berechtigungsbits abgebildet und nach denen sortiert werden soll:
SELECT BENUTZER.Benutzer
FROM BENUTZER WHERE (BENUTZER.Benutzer="Thomas") OR (BENUTZER.Berechtigung & 1>0) OR (BENUTZER.Berechtigung & 4>0);
Code:
Doch statt 1, 4 oder 5 steht im Feld Sortierung immer "14", also der Text "1" und "4" zusammen.
SELECT BENUTZER.Benutzer, (INT([BENUTZER].[Berechtigung] & 1) + INT([BENUTZER].[Berechtigung] & 4)) AS Sortierung
FROM BENUTZER GROUP BY BENUTZER.Benutzer, Sortierung HAVING (BENUTZER.Benutzer="Thomas") OR (BENUTZER.Berechtigung & 1>0) OR (BENUTZER.Berechtigung & 4>0) ORDER BY Sortierung; Wie kann ich die Summe dieser Bitoperation erhalten? Gruß e-gon |
AW: SQL ORDER BY mit Bitoperation
Sieht so aus, dass tatsächlich eine String Konkatenierung stattfindet. Schon mal explizite Typkonvertierung zu Int über das Bit AND gelegt?
Prüfbar wäre es ja auch, wenn man mit anderen Operanden arbeitet, sodass 0 rauskommen muss. Ergebnis wäre dann bspw "04" oder so. P.S.: Der Spaltentyp müsste natürlich auch String bzw. Varchar anzeigen, damit wäre das dann belegt. |
AW: SQL ORDER BY mit Bitoperation
Hallo Jo,
danke für die schnelle Antwort! Wie meinst Du das mit der expliziten Konvertierung zu Int? Das habe ich doch bereits in der Abfrage
Code:
gemacht, oder nicht?
INT([BENUTZER].[Berechtigung] & 1)
Das tut jedenfalls auch nicht:
Code:
Gruß
INT(INT([BENUTZER].[Berechtigung]) & INT(1))
e-gon |
AW: SQL ORDER BY mit Bitoperation
Sorry, das war Blödsinn. Ich bin mit den Code Fenstern durcheinander gekommen.
Was sagt denn der Spaltentyp von Sortierung? Und was sagt der Spaltentyp bei einer Bit And Operation? falls es (trotzdem) ein Texttyp ist: Alternativ 1 kannst Du statt INT ggF. Clng oder CDbl versuchen. Alternativ 2 kannst Du mit eine Pseudo Substraktion vielleicht einen Zahlentyp erzwingen: (([FeldWert] & xy)-0) + (([FeldWert] & z)-0) usw. Das Minus hat sehr Wahrscheinlich keine typabhängige Überladung. |
AW: SQL ORDER BY mit Bitoperation
Der Spaltentyp von Sortierung ist Zahl.
Bei einer Bit AND-Operation kommt für alle Datensätze, bei denen eine der Möglichkeiten oder beides zutrifft, -1 ansonsten 0 heraus.
Code:
Und CInt oder CDbl haben leider genauso wenig Wirkung wie eine pseudo Subtraktion!
(INT([BENUTZER].[Berechtigung] AND 1) + INT([BENUTZER].[Berechtigung] AND 4)) AS Sortierung
Ich werde noch wahnsinnig! :wall: :wall: Gruß e-gon |
AW: SQL ORDER BY mit Bitoperation
Zitat:
Code:
Versuch es mal so
(abs(INT([BENUTZER].[Berechtigung] AND 1))*1 + abs(INT([BENUTZER].[Berechtigung] AND 4)*4) AS Sortierung
Gruß K-H P.S. Access ist doch für Masochisten:mrgreen: |
AW: SQL ORDER BY mit Bitoperation
Hallo K-H,
die Idee war gut! Doch leider scheint der "AND"-Operator nicht das zu sein, was er sein müsste!
Code:
bringt für ALLE Werte von Berechtigung > 0 eine -1!!!
[BENUTZER].[Berechtigung] AND 1
Was für ein Mist dieses Access!!! Zitat:
Gruß e-gon |
AW: SQL ORDER BY mit Bitoperation
Das AND in SQL erzeugt wohl immer True/False und ist kein BitAnd.
Das "&" scheint analog dem "&" in Excelformeln zu funktionieren, also Concatenation. Ein BitAnd oder BAND scheint es nicht (mehr) zu geben. Ein selbstgebaute VBA Function mit:
Code:
funktioniert aber und kann in einer Abfrage verwendet werden, um mit den Ergebnissen weiterzurechnen.
Public Function BitwiseAndQuery(a, b As Integer) As Integer
BitwiseAndQuery = a And b End Function select BitwiseAndQuery(1,4) ; >0 select BitwiseAndQuery(5,4) ; >4 |
AW: SQL ORDER BY mit Bitoperation
Hallo jobo!
Vielen Dank für die Hilfe! Damit funktioniert es endlich! :thumb: Gruß e-gon |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz