Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Alle Werte im Bool Feld gleich oder nicht? (https://www.delphipraxis.net/213322-alle-werte-im-bool-feld-gleich-oder-nicht.html)

BlueStarHH 9. Jul 2023 13:00

Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC

Alle Werte im Bool Feld gleich oder nicht?
 
Hallo,

ich habe eine Tabelle mit einer Integer-ID und einem Boolean Feld MyField, das keine Null-Werte enthalten kann. Wie kann ich per SQL nun ermitteln, ob alle Datensätze mit einer bestimmte ID im Feld MyField nur true, nur false oder gemischt sind?

select ... from MyTable where ID in (1, 2);

Beispiele
ID MyField
1 true
2 true
3 false

SQL-Ergebnis soll true sein

ID MyField
1 false
2 false
3 true

SQL-Ergebnis soll false sein

ID MyField
1 true
2 false
3 false

SQL-Ergebnis soll null sein

Delphi.Narium 9. Jul 2023 15:23

AW: Alle Werte im Bool Feld gleich oder nicht?
 
Bitte präzisiere Deine Fragestellung.
Zitat:

ob alle Datensätze mit einer bestimmte ID im Feld MyField nur true, nur false oder gemischt sind?
Du fragst aber mit IN zwei IDs ab.

Das dritte Beispiel müsste daher für ID = 1 true liefern und für ID = 2 false.

Ansonsten fragst Du nicht nach dem Ergebnis
Zitat:

ob alle Datensätze mit einer bestimmte ID
sondern nach
Zitat:

ob alle Datensätze zusammengefasst zu allen angegebenen IDs im Feld MyField in Summe ausschließlich true, in Summe ausschließlich false oder gemischt sind?
Was ist gewünscht?

Weitere Besiepiele

ID MyField
1 true
1 false
2 false
2 false
3 false

SQL-Ergebnis soll für ID 1 null sein und für ID 2 false

ID MyField
1 true
1 true
2 false
2 false
3 false

SQL-Ergebnis soll für ID 1 true sein und für ID 2 false

ID MyField
1 false
1 false
2 true
2 false
3 false

SQL-Ergebnis soll für ID 1 false sein und für ID 2 null

ID MyField
1 false
1 true
2 true
2 false
3 false

SQL-Ergebnis soll für ID 1 und für ID 2 jeweils null

dataspider 9. Jul 2023 16:52

AW: Alle Werte im Bool Feld gleich oder nicht?
 
Mir fällt nur sowas ein:

SQL-Code:
with base as
  (
    select bool from test where id in (1, 2)
  )
  select
  case
    when (select count(*) from base) = (select count(*) from base where base.bool = true) then true
    when (select count(*) from base) = (select count(*) from base where base.bool = false) then false
  else
    null
  end result
  from rdb$database
Wobei im Beispiel die Tabelle test und das Feld bool heisst.

Ich würde dafür aber eine Stored Procedure schreiben...[EDIT]Ist Quatsch, geht bei in () ja gar nicht[/EDIT]

Frank

Delphi.Narium 9. Jul 2023 17:20

AW: Alle Werte im Bool Feld gleich oder nicht?
 
Zwei Versuche:

Wenn Auswertung ID-übergreifend gewünscht ist:
SQL-Code:
select
  case when (IsTrue + IsFalse) <> 1 then null else
    case when IsTrue = 1 then IsTrue else IsFalse end
  end as Ergebnis
from (
  select Max(IsTrue) as IsTrue, Max(IsFalse) as IsFalse
  from (
    select distinct
      case when myField = true then 1 else 0 end as IsTrue,
      case when myField = false then 1 else 0 end as IsFalse
    from myTable where ID in (1,2)
  )
)
Wenn Auswertung je ID gewünscht ist:
SQL-Code:
select
  ID,
  case when (IsTrue + IsFalse) <> 1 then null else
    case when IsTrue = 1 then IsTrue else IsFalse end
  end as Ergebnis
from (
  select ID, Max(IsTrue) as IsTrue, Max(IsFalse) as IsFalse
  from (
    select distinct
      ID,
      case when myField = true then 1 else 0 end as IsTrue,
      case when myField = false then 1 else 0 end as IsFalse
    from myTable where ID in (1,2)
  ) group by ID
)
(nur ungetestet hingedaddelt)

Uwe Raabe 9. Jul 2023 18:09

AW: Alle Werte im Bool Feld gleich oder nicht?
 
Das müsste aber auch einfacher gehen. Natürlich auch ungetestet:
SQL-Code:
Select
IIF(Max(myField) = Min(myField), Max(myField), NULL)
from myTable where ID in (1,2)

BlueStarHH 9. Jul 2023 18:22

AW: Alle Werte im Bool Feld gleich oder nicht?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1524365)
Das müsste aber auch einfacher gehen. Natürlich auch ungetestet:
SQL-Code:
Select
IIF(Max(myField) = Min(myField), Max(myField), NULL)
from myTable where ID in (1,2)

Danke, das klappt genau so, wie ich es brauche und ist schön kurz. Danke auch an alle anderen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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