Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL ORDER BY mit Bitoperation (https://www.delphipraxis.net/177931-sql-order-mit-bitoperation.html)

e-gon 6. Dez 2013 13:11

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:
SELECT BENUTZER.Benutzer
FROM BENUTZER
WHERE (BENUTZER.Benutzer="Thomas") OR (BENUTZER.Berechtigung & 1>0) OR (BENUTZER.Berechtigung & 4>0);
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:
Code:
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;
Doch statt 1, 4 oder 5 steht im Feld Sortierung immer "14", also der Text "1" und "4" zusammen.

Wie kann ich die Summe dieser Bitoperation erhalten?

Gruß
e-gon

jobo 6. Dez 2013 13:16

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.

e-gon 6. Dez 2013 13:25

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:
INT([BENUTZER].[Berechtigung] & 1)
gemacht, oder nicht?

Das tut jedenfalls auch nicht:
Code:
INT(INT([BENUTZER].[Berechtigung]) & INT(1))
Gruß
e-gon

jobo 6. Dez 2013 14:04

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.

e-gon 6. Dez 2013 14:53

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:
(INT([BENUTZER].[Berechtigung] AND 1) + INT([BENUTZER].[Berechtigung] AND 4)) AS Sortierung
Und CInt oder CDbl haben leider genauso wenig Wirkung wie eine pseudo Subtraktion!

Ich werde noch wahnsinnig! :wall: :wall:

Gruß
e-gon

p80286 6. Dez 2013 17:32

AW: SQL ORDER BY mit Bitoperation
 
Zitat:

Zitat von e-gon (Beitrag 1238801)
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.

Genau das ist das Problem!

Code:
(abs(INT([BENUTZER].[Berechtigung] AND 1))*1 + abs(INT([BENUTZER].[Berechtigung] AND 4)*4) AS Sortierung
Versuch es mal so

Gruß
K-H

P.S. Access ist doch für Masochisten:mrgreen:

e-gon 6. Dez 2013 18:00

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:
[BENUTZER].[Berechtigung] AND 1
bringt für ALLE Werte von Berechtigung > 0 eine -1!!!

Was für ein Mist dieses Access!!!

Zitat:

P.S. Access ist doch für Masochisten
Wem sagst Du das!

Gruß
e-gon

jobo 6. Dez 2013 18:33

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:
Public Function BitwiseAndQuery(a, b As Integer) As Integer
    BitwiseAndQuery = a And b
End Function
funktioniert aber und kann in einer Abfrage verwendet werden, um mit den Ergebnissen weiterzurechnen.

select BitwiseAndQuery(1,4) ;
>0
select BitwiseAndQuery(5,4) ;
>4

e-gon 6. Dez 2013 19:08

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 23:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz