Monday 17 March 2014

Punktfang und NULL Werte - Teil 2

Das Problem von heute morgen ist doch etwas anders gelagert als es auf den ersten Blick scheint. Hier eine Übersicht über unterschiedliche thematischen Regeln bzw. "Ausdrücke" und deren Ergebnis in Map und Oracle.

Ausgangsbedingungen:

- es gibt nur eine Regel im Layer
- Tabelle mit 6239 Datensätzen,
CREATION_CODE_XY_1    Anzahl
<null>                1222
2                        1
8                     5016   



Test 1 Regel: "NOT CREATION_CODE_XY_1 IN (8)"

Map-Ergebnis:
Objekte mit <null> werden dargestellt, aber Punktfang auf diese funktioniert nicht.
(Objekte mit z.B. CREATION_CODE_XY_1 = 2 werden dargestellt und Punktfang funktioniert).

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 not in (8);
COUNT(*)
--------
       1

Anmerkung:
- Map und Oracle liefern unterschiedliche Ergebnisse.
- merkwürdiger Nebeneffekt in Map - der Punktfang funktioniert nicht.

Was ist an dieser Stelle der Fehler? Das Map ein anderes Ergebnis liefert oder der fehlende Punktfang?

Fügt man jetzt eine thematische Regel ohne Ausdruck ("Standard") hinzu, setzt die Farbe des Symbols auf "keine"  und verschiebt die Regeln nach unten dann funktioniert auch der Objektfang (zusätzlich wird aber auch auf das "unsichtbare" Symbol gesnappt).
      
      
Test 2 - Regel: "CREATION_CODE_XY_1 <> 8"


Ergebnis:
Objekte mit <null> Wert werden nicht dargestellt.
(Objekte mit z.B. NOT CREATION_CODE_XY_1 = 2 werden dargestellt und Punktfang funktioniert).

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 <> 8;
COUNT(*)
--------
       1

Anmerkung:
- Map und Oracle liefern das gleiche Ergebnis
- der Unterschied im Ausdruck zwischen Test 1 und 2 ist minimal führt in Map aber zu einem ganz anderen Ergebnis


Test 3a - Regel: CREATION_CODE_XY_1  NULL   OR   NOT  CREATION_CODE_XY_1  IN ( 8 )

Ergebnis:
Objekte mit <null> werden dargestellt, Punktfang funktioniert.

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 is null or creation_code_xy_1 not in (8);
COUNT(*)
--------
    1223

Anmerkung:
- Map und Oracle liefern gleiches Ergebnis
   
Test 3b - Regel : NOT  CREATION_CODE_XY_1  IN ( 8 ) OR  CREATION_CODE_XY_1  NULL

Ergebnis:
Objekte mit <null> werden dargestellt, Punktfang funktioniert.

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 not in (8) or creation_code_xy_1 is null;
COUNT(*)
--------
    1223


Anmerkung:
- Map und Oracle liefern gleiches Ergebnis

 
Test 4a - Regel: CREATION_CODE_XY_1   NULL   OR   CREATION_CODE_XY_1   <> 8
 

Ergebnis:
Objekte mit <null> werden dargestellt, Punktfang funktioniert.

SQL Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 is null or creation_code_xy_1 <> 8;
COUNT(*)
--------
    1223

Anmerkung:
- Map und Oracle liefern gleiches Ergebnis   
   
Test 4b - Regel: CREATION_CODE_XY_1  <>8  OR  CREATION_CODE_XY_1  NULL 

Ergebnis:
Objekte mit <null> werden nicht dargestellt

SQL Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 <> 8 or creation_code_xy_1 is null;
COUNT(*)
--------
    1223

Anmerkung:
- Map und Oracle liefern ein unterschiedliches Ergebnis, Reihenfolge des Ausdruckes beeinflusst Ergebniss in Map (nicht aber beim Test 3b, bei dem die neue Reihenfolge kein anderes Ergebnis zur Folge hatte).


Schlussfolgerungen:
- treten <null> Werte in den Daten auf ist besondere Aufmerksamkeit gefordert
- <null> Werte immer separat behandeln
- auf <null> immer mit den speziellen Ausdrücken testen (is null / is not null)
- Ergebnis mit Testdatensatz veifizieren
- Reihenfolge der Ausdrücke kann in Map das Ergebnis beeinflussen
- in Map führt Operator <> zu anderem Ergebnis als Operator (NOT) IN


Noch am Rande – folgende Ausdrücke wurden in einem DM verwendet. Der letzte als "Auffangregel" um auf "leere" Datensätze bei der Symbolart zu testen (die in der Regel <null> sind):

ID_SYMBOLART  =  15  AND  ID_FARBE  =  1
….
to_char(ID_SYMBOLART)  = '' AND ID_FARBE  =  1


Der Ausdruck führt ebenfalls dazu, dass der Punktfang nicht funktioniert. Der Ausdruck muss korrekt lauten:
NOT ID_SYMBOLART NULL AND ID_FARBE = 1


Map 2013, SP2

No comments:

Post a Comment