NULL-data processing.

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

weiss jemand von Euch, ob folgendes Verhalten "normal" ist oder nicht
bzw. ob es ein Standardverhalten ist?

Es gibt zwei Tabellen (TabA und TabB) mit jeweils einer Spalte, nennen wir sie
mal strField.

TabA.strField
TabB.strField

Vergleicht man zwei Zeilen, die NULL sind, miteinander (in einem Join etc.),
dann liefert die Bedingung FALSE bzw. keine Datensätze zurück.
Code:
FROM Tabelle1 TabA, Tabelle2 TabB
WHERE ...
    AND TabA.strField = TabB.strField

Prüft man, ob beide NULL sind, dann ist das Ergebnis TRUE bzw. es werden paar
Datensätze zurückgegeben.

Code:
FROM Tabelle1 TabA, Tabelle2 TabB
WHERE ...
  AND TabA.strField IS NULL 
  AND TabB.strField IS NULL

Ist es bei allen Datenbanken so? Ich verwende SAPDB.
Nach meinem Verständnis sollte NULL = NULL immer TRUE sein.
 
G

Guest

Gast
Übrigens, Abhilfe schafft hier folgendes.
Code:
WHERE ...
  AND (
    (TabA.strField = TabB.strField) 
    OR (TabA.strField IS NULL AND TabB.strField IS NULL)
  )
Warum ein direkter Vergleich zweier NULL-Werte nicht möglich
ist, ist mir aber ein Rätsel.
 

foobar

Top Contributor
Code:
FROM Tabelle1 TabA, Tabelle2 TabB
WHERE ...
    AND TabA.strField = TabB.strField
In diesem Fall machst du einen Join über 2 Tabellen, das heißt beide Tabellen werden, anhand der Whereklausel, miteinander verknüpft und die Ergebnismenge wird zurück geliefert.

Code:
FROM Tabelle1 TabA, Tabelle2 TabB
WHERE ...
  AND TabA.strField IS NULL 
  AND TabB.strField IS NULL
Hier erstellst du ein Kreuzprodukt. Das bedeutet die beiden Tabellen werden ohne eine Bedingung miteinander verknüpft. Da du in der Whereklausel auf null prüfst bekommst du alle Datensätze bei denen diese Bedingung zutrifft.

P.S. SQL ist keine imperative sondern eine deklarative Sprache. Das bedeutet du definierst eine Ergebnismenge, anstatt einen konkreten Lösungsweg vorzugeben.
 
G

Guest

Gast
foobar hat gesagt.:
Was genau willst du denn machen?
Die Zeilen zweier "fast" gleicher Tabellen holen, die in bestimmten
Spalten übereinstimmen.
z.B.
Angenommen in Tabelle TabA steht folgendes
a=1, b=2, c=NULL, ...
In Tabelle TabB dann genau das gleiche
a=1, b=2, c=NULL, ...
Code:
WHERE TabA.a = TabB.a
  AND TabA.b = TabB.b
  AND TabA.c = TabB.c
sollte dann die Zeile mit den Spalten aus beiden Tabellen liefern.
Ist aber nicht der Fall, sobald ein Spaltenpaar NULL ist.
Für den Fall, wo sowas möglich ist, muss man immer diese
"komplizierten" Bedingungen schreiben.
Im obigen Fall
Code:
WHERE TabA.a = TabB.a
  AND TabA.b = TabB.b
  AND ((TabA.c = TabB.c) OR (TabA.c IS NULL AND TabB.c IS NULL))

Hat mich heute etwas Zeit mit dem Debugger gekostet,
dann habe ich die Abfragen erneut geprüft und bin auf
dieses Verhalten gestossen. :(
 

foobar

Top Contributor
Dann mußt du einen Left-Join machen:
Code:
Select *
from taba a left join tabb b on (a.a = b.a)
where a.b = b.b
Dann bekommst du auch Datensätze in denen nulls in der zweiten Tabelle sind.
 
G

Guest

Gast
Nein, es liefert auch falsche Ergebnisse.

Es sind zwei, von der Struktur her, gleiche Tabellen.
Die eine ist einer Art Template-Tabelle, die andere
enthält vom Benutzer modifizierte Daten, die
ursprünglich aus der globalen Vorlage kommen.
Der Wert der Spalte, die NULL enthalten kann, hat eine
spezielle Bedeutung. NULL = überall gültig, sonst abhängig
vom Benutzer.
Jetzt soll der Anwender die Möglichkeit haben, die modifizierten
Einträge in seiner lokalen Tabelle mit denen aus der globalen
Tabelle abzugleichen, wenn sich diese von der lokalen in
irgendeiner Form unterscheiden.
Das ganze läuft teilweise interaktiv, so dass ich zuerst alle
potentiellen Kandidaten für den Abgleich finden muss.
Es gibt dann zusätzlich Einträge, die der Anwender als "readonly"
gekennzeichnet hat. Diese sollen dann ignoriert bzw. nicht
upgedated werden.

Wenn's nicht genug wäre, es gibt da noch untergeordnete Tabellen,
die bei dem Vergleich auch eine Rolle spielen. *amocklauf*
 

foobar

Top Contributor
Aber das würde dann ja bedeuten, daß jeder Benutzer eine eigene Tabelle hat. Was wiederum bedeutet, daß wenn du einen Benutzer anlegst du auch eine Tabelle anlegen mußt. Warum machst du nicht eine Tabelle für die Userdaten mit einer Spalte, die dann einen Benutzer referenziert? Was soll denn Ziel des ganzen sein?
 
G

Guest

Gast
Es sind zwei Tabellen.

Die Tabelle mit den Anwender-spezifischen Modifikationen
hat einen eindeutigen Verweis (FK) auf den entsprechenden
Anwender. Es ist nicht pro Anwender eine Tabelle. Solche
Schweinereien mach' ich nicht :)
Eigentlich wäre es auch möglich alles in eine Tabelle zu packen,
lässt sich aber in zwei getrennten Tabellen besser verwalten.
Da sind auch unterschiedliche Leute für die Datenbankpflege zuständig.
Nicht jeder darf an den globalen Daten herumfummeln.

Wie ich schon schrieb, das hier funktioniert (auch bei den NULL-Spalten)
Code:
WHERE TabA.a = TabB.a 
  AND TabA.b = TabB.b 
  AND ((TabA.c = TabB.c) OR (TabA.c IS NULL AND TabB.c IS NULL))
Soll einfach heissen. Beide gleich oder beide NULL.

Aber wenn beide NULL sind, dann sind sie auch gleich.

OK das ganze wird langsam zu philosofisch :)
 

foobar

Top Contributor
Wenn du in beiden Spalten Null-Werte hast brauchst du einen Full Left Join, damit bekommst du alle Daten egal in welcher der Tabellen nulls enthalten sind. Ich weiß aber nicht ob es diesen Join bei SAPDB gibt.
 
G

Guest

Gast
Ja, FULL JOIN wird in SAPDB auch unterstützt, ist aber grauenhaft langsam,
wenn die Tabellen viele Daten enthalten :)

Habe etwas mit der Join-Syntax experimentiert.
LEFT JOIN tut's auch und ist schnell genug.
Code:
SELECT ...
FROM Tabelle1 TabA LEFT JOIN Tabelle2 TabB ON (TabB.a = TabA.a AND TabB.b = TabA.b AND TabB.c = TabA.c)
WHERE TabA.userId = ... weitere Bedingungen

Danke. Deine Antworten haben meine grauen Zellen etwas aufgeweckt :)
 
G

Guest

Gast
Ehmmm... war quatsch. Habe bei dem Ergebnis nicht richtig hingeschaut.
Ich brauche doch die Daten aus beiden Tabellen. :oops:

Es bleibt bei der Variante:
Code:
WHERE TabA.a = TabB.a 
  AND TabA.b = TabB.b 
  AND ((TabA.c = TabB.c) OR (TabA.c IS NULL AND TabB.c IS NULL))
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
zhermann Data truncation: Incorrect date value: 'null' for column Datenbankprogrammierung 31
Maxim6394 EclipseLink + SQLite | Unable to acquire a connection from driver [null] Datenbankprogrammierung 6
ma095 value NULL- Datenbank Postgresql Spring - intellij community Datenbankprogrammierung 0
P Herausfinden wann Query null zurück gibt? Datenbankprogrammierung 1
N DBUnit und null Datenbankprogrammierung 6
P Null Werte bei der Normalisierung Datenbankprogrammierung 2
Z ResultSet ist null warum? Datenbankprogrammierung 12
krgewb getDouble auch mit null möglich? Datenbankprogrammierung 2
D SQL Server Android App: 'int java.lang.String.length()' on a null object reference Datenbankprogrammierung 15
I Datenbankverbindung Oracle DB klappt nicht - getConnection returned null Datenbankprogrammierung 8
M Derby/JavaDB einen Null-Wert in die Datenbank schreiben Datenbankprogrammierung 7
D Oracle NullPointerException bei select mit Null Values Datenbankprogrammierung 5
T IllegalArgumentException: Person[ id=null ] is not a known entity type.??? Datenbankprogrammierung 0
C PostgreSQL JDBC + PostgreSQL: getLong liefert 0 statt NULL Datenbankprogrammierung 2
R JPA dynamisch auf NULL abfragen Datenbankprogrammierung 2
OnDemand LEFT JOIN id hat Null Datenbankprogrammierung 6
P executeQuery liefert null zurück Datenbankprogrammierung 5
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
C PreparedStatement und null Datenbankprogrammierung 13
M HSQLDB EntityManager null? Datenbankprogrammierung 7
O MySQL PreparedStatements: int null Datenbankprogrammierung 7
S Null Pointer exception statement Datenbankprogrammierung 8
M JPA NOT NULL Datenbankprogrammierung 11
E H2 - Datenbankabfrage gibt NULL aus? Datenbankprogrammierung 4
Q java.lang.NullPointerException connection = null Datenbankprogrammierung 13
C Metadata der SessionFactory immer null Datenbankprogrammierung 2
N Connection bleibt null Datenbankprogrammierung 7
F Derby/JavaDB Exception - Cannot accept Null Value (help) Datenbankprogrammierung 10
G MySQL Timestamp null Datenbankprogrammierung 2
H Fehler bei null-Datum in MySQL-DB Datenbankprogrammierung 2
G getConnection() liefert null Datenbankprogrammierung 3
A MSSQL - Spalten mit der Option: NULL zulassen Datenbankprogrammierung 2
G Hibernate oneToMany Not null Datenbankprogrammierung 4
S Update mit null Datenbankprogrammierung 11
H Date null = 30.11.0002? Datenbankprogrammierung 6
P Fehler: result-set zeigt auf null, aber warum Datenbankprogrammierung 4
R Warum ist meine Connection null? Datenbankprogrammierung 6
P Wie übergebe ich einen NULL Wert in meinem Java-Programm? Datenbankprogrammierung 7
W RsultSet auf null abfragen funktioniert nicht Datenbankprogrammierung 4
D hibernate + null + primitive Datentypen Datenbankprogrammierung 2
F MySQL gibt nur null zurück Datenbankprogrammierung 3
T Cast-Fehler: Spring Data exists.... boolean??? Datenbankprogrammierung 1
sonalim21 Data from one Excel workbook in Alteryx Datenbankprogrammierung 0
O HOW TO INSERT PRIMARY INTO ANOTHER TABLE AND USE IT AS FOREIGN KEY TO DISPLAY DATA IN A RELATIONSHIP Datenbankprogrammierung 3
L LOAD DATA INFILE mit Oracle Datenbankprogrammierung 24
Dimax MySQL LOAD DATA INFILE -id aus dem Code und Rest aus dem File. Datenbankprogrammierung 5
B MySQL Data Tools Plattform - "Database Connections" findet den Treiber nicht Datenbankprogrammierung 1
B JDBC-Connection: Data source name too long Datenbankprogrammierung 3
E Data truncation Incorrect datetime value Datenbankprogrammierung 2
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E falscher Befehl executeQuery() issue data Datenbankprogrammierung 12
K MySQL Load Data InFile Datenbankprogrammierung 7
I java.sql.SQLException: No data found Datenbankprogrammierung 3
Dragonfire Entwurfsfragen zur Anbindung an einer MySQL DB - Klassenstruktur zum Data Model Datenbankprogrammierung 5
M Mit Java Data Objects Daten in einer MySQL-Datenbank manipul Datenbankprogrammierung 9
M java.sql.SQLException: No data found Datenbankprogrammierung 9
T Problem mit Data truncation Datenbankprogrammierung 3
G Data Truncated Datenbankprogrammierung 23
R MySQL denies access to data source - java.sql.SQLException Datenbankprogrammierung 14

Ähnliche Java Themen

Neue Themen


Oben