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