all(Feld1, Feld2 Feld3) is null: Prüfen ob kein Wert null ist

Hallo!
Folgendes Problem: Ich habe eine lange Liste an Datensätzen und will prüfen, welche davon bestimmten Kriterien genügen, also bei denen die entsprechenden Felder nicht NULL sind. ich dachte, dies lässt sich am besten mit ALL lösen kriege aber die Syntax nicht gebacken. Im Beispiel unten hab ich versucht das nachzustellen und frage nach ob alles 1 ist, das funktioniert auch nur wie baue ich statt dessen ein IS NOT NULL ein? Es klappt wenn ich alle Felder in Bool verwandle und nach TRUE frage, ich könne auch im übergeordneten alles, was NULL ist, in einen unsinnigen Wert verwandeln, was ich aber gerne wegen Unschönheit und eventueller Widersprüchlichkeit vermeiden möchte. Auch könnte man jedes Feld einzeln abfragen, da das aber im Realen noch verschiedene Kontexte mit unterschiedlichen Bedingungen abbilden soll, wird das völlig unübersichtlich.
Frage also: Wie mache ich ‘is not null all(Feld1, Feld2, Feld3)’?

Kleines Beispiel mit Abfrage nach 1:

create table test_any (
  id serial primary key,
  v1 int,
  v2 int,
  v3 int);
 
  insert into test_any(v1, v2, v3) values( 1, 1, 1);
  insert into test_any(v1, v2, v3) values( 1, null, 1);
  insert into test_any(v1, v2, v3) values( 1, 1, null);
  insert into test_any(v1, v2, v3) values( null, 1, 1); 
  insert into test_any(v1, v2, v3) values( 1, 1, 1);
  insert into test_any(v1, v2, v3) values(null, null, null);

 select id
   from test_any 
   where 1 = all(array[v1, v2, v3]);

Grüße und Dank Im Voraus
Uwe

test=*# select row(v1,v2,v3) from test_any where (row(v1,v2,v3) is distinct from row(null,null,null));
   row   
---------
 (1,1,1)
 (1,,1)
 (1,1,)
 (,1,1)
 (1,1,1)
(5 rows)

test=*# select id from test_any where (row(v1,v2,v3) is distinct from row(null,null,null));
 id 
----
  1
  2
  3
  4
  5
(5 rows)

test=*# select id from test_any where (row(v1,v2,v3) is not distinct from row(null,null,null));
 id 
----
  6
(1 row)

test=*#

ach so, wenn du wissen willst, wo nirgends NULL ist:

test=*# select * from test_any where (row(v1,v2,v3) is not distinct from row(1,1,1));
 id | v1 | v2 | v3 
----+----+----+----
  1 |  1 |  1 |  1
  5 |  1 |  1 |  1
(2 rows)

Mir ist nicht ganz klar, was genau Du testen möchtest. Im Text schreibst Du, Du möchtest auf NULL testen, aber Dein Beispiel vergleicht dann alle Werte mit 1.

Wenn es darum geht zu prüfen, ob alle Spaltenwerte NOT NULL sind, kann man das mit JSON Funktionen machen.

to_jsonb() wandelt eine komplette Zeile in ein JSON um. Mit der Funktion jsonb_strip_nulls() kann man alle NULL Werte entfernen. Wenn beide Ausdrücke gleich sind, dann sind alle Spaltenwerte NOT NULL

select *
from test_any t
where jsonb_strip_nulls(to_jsonb(t)) = to_jsonb(t)

Wenn man eine Spalte von dem Vergleich ausschließen will, geht das auch:

select *
from test_any t
where jsonb_strip_nulls(to_jsonb(t)) - 'v1' = to_jsonb(t) - 'v1'

Die Prüfung ob mindestens eine Spalte NOT NULL ist, geht hingegen einfacher mit der Row Syntax:

select *
from test_any t
where not (row(v1,v2,v3) is null)

Analog die Prüfung ob alle Werte NULL sind:

select *
from test_any t
where row(v1,v2,v3) is null

Das war nur ein Beispiel zur Illustration, weil ich das mit NULL nicht hingekriegt hab.
Aber Danke, ich werd das mit der row-Syntax mal ausprobieren, hört sich an als würde das funktionieren.

Guten Morgen allerseits!
Die row-Syntax liefert das gewünschte Ergebnis in der folgenden Weise:

 select id
   from test_any 
   where row(v1, v2, v3) is not null

Dies liefert korrekt alle Datensätze, in denen alle Felder NOT NULL sind.

Vielen Dank!