Datenbanken im Vergleich
Diese Informationen spiegeln den Stand ab Version 22.2.64 wieder.
Gegenüberstellung aller Funktionen
Zeichenerklärung
Schlüssel | Bedeutung |
---|---|
X | Funktion ist verfügbar |
- | Funktion nicht verfügbar |
(N) | Die gleiche Funktion ist im Datenbanksystem unter einem anderen Namen verfügbar. MapEdit Desktop und Professional ersetzt den Namen intern zur Laufzeit automatisch. Beim anlegen von Views wird der Name in der Datenbank ersetzt. Wird das MapEdit Datenmodell verwendet dann wird die Original View Definition mit dem Original eingegeben Namen in der Tabelle ME_VIEW gespeichert. Damit kann das Datenmodell später, wenn die Datenmodellvorlagen benutzt werden diese Definition auch für andere Datenbanksystem verwendet werden. |
(P) | Die Funktion wird von MapEdit durch eine 'Stored Procedure' Funktion bereitgestellt. Diese sind aber nur in MapEdit Datenstrukturen vorhanden. Die Funktion kann mit MapGuide, MapServer und anderen Tools verwendet werden. |
(E) | SQLite Extension. Die Funktion steht in einer SQLite Extension zur Verfügung die genutzt wird wenn MapEdit Desktop oder Professional verwendet wird. Wird ein View angelegt der diese Funktion benutzt, dann kann die Datenbank nicht mit MapGuide, MapServer oder andere Tools ausser MapEdit Desktop/Professional verwendet werden. Die Funktionen können in SQLs nur von MapEdit Desktop/Professional verwendet werden |
(W) | Workaround oder Spezielle Lösung. |
Text Funktionen
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
ASCII | X | (N) | X | X | In SQLite "unicode" |
CHR | X | (N) | X | (N) | In SQLite und SQLServer "char" |
CONCAT | X | (W) | X | X | siehe unten |
Concat mit || | X | X | X | (N) | siehe unten |
INITCAP | X | (E) | X | (P) | SQLite/SQLServer ME_INITCAP |
INSTR(s,s) | X | X | (N) | (N) | Postgres "StrPos", SQLServer "charindex" |
INSTR(s,s,i) | X | (W) | (W) | (N) | siehe unten. "StrPos"/"charindex" |
INSTR(s,s,i,i) | X | - | (P) | - | siehe unten. postgre: "me_instr" |
LENGTH | X | X | X | (N) | SqlServer: "len" |
LOWER | X | (E/W) | X | X | siehe unten. |
LPAD | X | (E/W) | X | (W) | siehe unten. |
LTRIM | X | X | X | X | |
REPEAT | (W) | (W) | X | (N) | sqlserver: REPLICATE |
REPLACE | X | X | X | X | siehe unten. |
RPAD | X | (E/W | X | (W) | see unten. |
RTRIM | X | X | X | X | |
SOUNDEX | X | X | (P) | X | In Postgres "me_soundex" |
SUBSTR | X | X | X | (N/W) | siehe unten. SQLServer "substring" |
TRANSLATE | X | (E) | X | X | in SqLite: "me_translate" |
TRIM | X | X | X | X | |
UPPER | X | (E/W) | X | X | siehe unten |
Numeric/Math Functions
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
ABS | X | X | X | X | |
ACOS | X | X | X | X | |
ASIN | X | X | X | X | |
ATAN | X | X | X | X | |
ATAN2 | X | X | X | (N) | SqlServer: ATN2 |
CEIL | X | X | X | (N) | SqlServer: Ceiling |
COS | X | X | X | X | |
COSH | X | X | X | - | |
EXP | X | X | X | X | |
FLOOR | X | X | X | X | |
GREATEST | X | (N) | X | (W) | siehe unten. SQLite "max" |
LEAST | X | (N) | X | (W) | siehe unten. SQLite "min" |
LN | X | X | X | (N) | SQL Server "log" |
LOG | X | X | X | - | |
MOD | X | (W) | X | (W) | Sqlite und Sqlserver verwenden % |
POWER | X | X | X | X | |
ROUND (numbers) | X | X | X | X | |
SIGN | X | X | X | X | |
SIN | X | X | X | X | |
SINH | X | X | X | - | |
SQRT | X | X | X | X | |
TAN | X | X | X | X | |
TANH | X | X | X | - | |
TRUNC (numbers) | X | (W) | X | (W) | siehe unten |
Numeric/ Analytic
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
AVG | X | X | X | X | |
COUNT | X | X | X | X | |
MAX | X | X | X | X | |
MIN | X | X | X | X | |
SUM | X | X | X | X |
Date/Time Functions
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
CURRENT_DATE | X | X | X | (N) | SQLServer: sysdatetime() |
CURRENT_TIMESTAMP | X | X | X | X | |
EXTRACT | X | - | X | - | |
LOCALTIMESTAMP | X | - | X | - | |
SYSDATE | X | (N) | (N) | (N) | Postgre:now(),SQLServer: sysdatetime() , SQLite: datetime('now') |
Conversion Functions
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
TO_CHAR | X | (W/E) | X | (W) | SQLServer: No format parameter |
TO_CLOB | X | (W) | (W) | (W) | siehe unten |
TO_DATE | X | (W) | (W) | (W) | siehe unten |
TO_NUMBER | X | (E) | X | (W) | SqlServer: Format is ignored |
TO_TIMESTAMP | X | - | X | - |
Analytic Functions
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
LISTAGG | X | (W/E) | (W) | (W) | siehe unten |
STRING_AGG | (W) | (W/E) | X | X | siehe unten |
Advanced Functions
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
CASE Statement | X | X | X | X | |
COALESCE | X | X | X | X | |
DECODE | X | (W) | (W) | (W) | wird durch CASE WHEN ersetzt. |
NULLIF | X | X | X | X | |
NVL | X | (N) | (N) | (N) | gleich wie coalesce |
NVL2 | X | (W) | (W) | (W) | wird durch CASE WHEN ersetzt. (Verfügbar ab Version 24.2.60) |
Spatial Functions
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
SDO_AREA | X | (E) | (N) | (W) | siehe unten |
SDO_INTERSECTION | X | (E) | (W) | (W) | siehe unten |
SDO_DISTANCE | X | (E) | (W) | (W) | siehe unten |
SDO_WITHIN_DISTANCE | X | (E) | (W) | (W) | siehe unten |
SDO_RELATE | X | (E) | (W) | (W) | eingeschränkt, siehe unten |
Andere
Name | Oracle | SQLite | Postgre | SQLServer | Hinweis |
---|---|---|---|---|---|
DUAL Table | X | (W) | (W) | (W) | siehe unten |
LIKE | X | (W/E) | X | X | siehe unten |
LIMIT | (W) | X | X | (W) | siehe unten |
sequence.NEXTVAL | X | (W/E) | (N) | (N) | siehe unten |
ROWNUM (to Limit Records) | X | (W) | (W) | (W) | siehe unten |
NULL und Leerer Text
Wenn man in Oracle mit SQL in ein Textfeld (varchar2) einen leeren Text einfügt, dann macht Oracle daraus ein NULL.
D.h. diese beiden Updates sind in Oracle identisch und erzeugen immer NULL als Wert.
update table set feld1='' where ID=17;
update table set feld1=NULL where ID=17;
Bei Postgres, SQLite und SQLServer ist das nicht so. Dort ist ein leerer Wert nicht das gleiche wie NULL.
CONCAT Funktion und Concat mit ||
Alle Datenbanken unterstützen den ||
Ausdruck.
SQLite hat keine Funktion mit dem Namen CONCAT.
In SQLite wird stattdessen ||
verwendet.
MapEdit wandelt in SQLite den Ausdruck:
CONCAT(X,Y)
in den Ausdruck
coalesce(X,'')||coalesce(Y,'')
um.
SQL Server hat keinen ||
Ausdruck, dort wird das "+" Zeichen verwendet
MapEdit wandelt in SQLServer den Ausdruck ||
in "+" um.
Beachten Sie das das Ergebnis der Funktion CONCAT nicht exakt gleich wie der ||
Ausdruck.
Beachten Sie den unterschied zwischen CONCAT und ||
im Zusammenhang mit NULL Werten
(oder Spalten die NULL enthalten)
Ausdruck | Ergebnis | Datenbank |
---|---|---|
CONCAT('A', null) | 'A' | Oracle, Postgres, SQLite, SQLServer |
'A'` | ` null | |
'A'` | ` null | |
'A'+null | NULL | SQlServer |
CONCAT(null,null) | NULL | Oracle |
CONCAT(null,null) | leerer String | Postgres, SQLServer |
INSTR(s,s,i) - INSTR mit 3 Parametern
INSTR mit parametern string, substring, startposition.
Postgre und SQLite haben keine Funktion mit dieser Parameter Anzahl. Als Workaround kann man aber die Funktionen strpos/substring (bzw. instr/substr) kombinieren.
MapEdit erzeugt aus dem Ausdruck:
select instr('the soap','soap',5) from dual
In Postgres den Ausdruck:
select (strpos(substring('the soap',5),'soap')+5-1) from dual
In SQLite den Ausdruck:
select (instr(substr('the soap',5),'soap')+5-1) from dual
in SQLServer Ausdruck:
select charindex('soap','the soap',5) from dual
INSTR(s,s,i,i) - INSTR mit 4 Parametern
INSTR mit parametern string, substring, Start Position occurrence
Postgres hat von sich aus keine solche Funktion. In MapEdit Datenmodellen steht die Funktion jedoch als Stored Procedure "me_instr" zur Verfügung.
In SQLite und SQLServer steht keine solche Funktion zur Verfügung.
LOWER/UPPER
SQLite besitzt eine UPPER und LOWER Funktion diese funktionieren aber nicht mit Umlauten äöü und andere sprachabhängige Zeichen.
MapEdit verwendet deswegen immer die extension Funktion "me_upper" bzw "me_lower".
Wenn --NOSIM
aktiviert ist wird das originale SQLite upper/lower verwendet
das Umlaute nicht umwandelt.
Wenn --NOMEFUN
aktiviert ist wird statt "me_upper"/"me_lower"
dieser workaround genutzt:
REPLACE(REPLACE(REPLACE(UPPER(X,'ä','Ä'),'ö','Ö'),'ü','Ü')
LPAD/RPAD
SQLite hat keine LPAD/RPAD Funktion.
MapEdit verwendet deswegen immer die extension Funktionen "ME_LPAD" und "ME_RPAD"
Wenn --NOMEFUN
aktiviert ist oder in views wird statt "ME_LPAD" und "ME_RPAD"
dieser Workaround genutzt:
text||substr(replace(hex(zeroblob(10)),'00','0'),1,10-length(text))
SQLServer hat keine LPAD/RPAD Funktion. MapEdit verwendet deswegen immer die stored Procedure Funktionen "ME_LPAD" und "ME_RPAD"
Wenn --NOMEFUN
aktiviert ist wird statt "ME_LPAD" und "ME_RPAD"
dieser Workaround genutzt:
SELECT RIGHT(REPLICATE('0',10)+text,10) from dual
SELECT LEFT(text+ REPLICATE('0',10),10) from dual
REPEAT
"Repeat" existiert in Postgres.
In SQLServer heist die Funktion "REPLICATE".
In SQLite gibt es keine Funktion dafür, die Funktion wird aber mit diesem Workaround von MapEdit simuliert werden.
replace(hex(zeroblob(5)),'00','test')
In Oracle gibt es keine Funktion dafür, die Funktion wird aber mit diesem Workaround von MapEdit simuliert werden.
RPAD(text, amount*LENGTH(text), text)
REPLACE
Oracle, SQLite, Postgres und SQLServer haben diese Funktion:
REPLACE(source, old_text, new_text )
Oracle unterstützt auch diese Variante: REPLACE(source, remove_text)
Wenn MapEdit in SQLite, Postgres, SQLServer auf ein "replace" mit zwei Parametern stößt dann fügt es als dritten parameter ein '' hinzu. Damit wird der Befehl dann lauffähig.
SUBSTR
In SQLServer heist die Funktion "substring" und benötigt immer 3 Parameter.
Oracle, SQLite und Postgres unterstützen auch die Variante mit 2 Parametern.
Wenn in SQLServer nur 2 Parameter angegeben sind dann erweitert MapEdit den fehlenden Parameter automatisch und setzt diesen auf "999999999" damit die Funktion ausgeführt word.
GREATEST
In SQLite heist die Funktion "max"
In SQLServer gibt es keine solche Funktion MapEdit verwendet dort diesen workaround:
(select MAX(a) FROM(VALUES(10),(11),(0),(13),(7)) AS TEMPTABLE(a))
Ausdruck | Ergebnis | Datenbank |
---|---|---|
greatest(10,null,11,0,13,7) | null | Oracle und SQLite |
greatest(10,null,11,0,13,7) | 13 | Postgres und SQLServer |
LEAST
In SQLite heist die Funktion "min"
In SQLServer gibt es keine solche Funktion MapEdit verwendet dort diesen workaround:
(select MIN(a) FROM(VALUES(10),(11),(0),(13),(7)) AS TEMPTABLE(a))
Ausdruck | Ergebnis | Datenbank |
---|---|---|
least(10,null,11,0,13,7) | null | Oracle und SQLite |
least(10,null,11,0,13,7) | 0 | Postgres und SQLServer |
TRUNC numbers
SQLite hat keinen "trunc" Befehl.
MapEdit verwendet hier:
select round(X - power(10,Y*-1)/2, Y)
In SQLServer gibt es keinen Befehl mit dem Namen "trunc". Der Befehl Round hat jedoch einen dritten Parameter der dazu auf 1 gesetzt werden kann.
Besipiel:
Round(x,y,1)
TO_CHAR - Konvertierung nach Text
SQLite: Hat keine TO_CHAR Funktion. Der Ausdruck wird in je nach Inhalt des Ausdrucks in eine printf oder Cast umgewandelt. Nötigenfalls bleibt der Ausdruck bei TO_CHAR und die SQLite Extension Funktion TO_CHAR wird verwendet.
SQLServer: Hat keine TO_CHAR Funktion. Der Ausdruck wird in "convert(varchar, ausdruck)" umgewandelt und Formatierungsangaben werden ignoriert.
TO_CLOB
SQLite: Hat keine TO_CLOB Funktion und keinen CLOB Datentyp. Der Ausdruck wird nach "cast(ausdruck as text)" umgewandelt. Es gibt jedoch auch eine SQLite Extension Funktion TO_CLOB.
Postgres: Hat keine TO_CLOB Funktion. Der Ausdruck wird nach "cast(ausdruck as text)" umgewandelt.
SQLServer: Hat keine TO_CLOB Funktion. Der Ausdruck wird nach "cast(ausdruck as text)" umgewandelt.
TO_DATE - Konvertierung Text nach Datum
MapEdit verwendet für Datumsfelder beim Postgres und Oracle den Datentyp "TIMESTAMP"
Postgres:
Im unterschied zu Oracle schneidet die TO_DATE Funktion bei Postgres die Uhrzeit beim umwandeln ab. Da der Rückgabewert der Funktion vom Typ "date" ist.
Bei Postgres enthaelt der Datentyp "date" keine Uhrzeit Angabe während bei Oracle die Uhrzeit beim Datentyp "date" enthalten ist.
Wenn TO_DATE mit Uhrzeit Formatangaben verwendet wird, dann wandelt MapEdit diese ab Version 23.1.257 automatisch in ein TO_TIMESTAMP Befehl um.
Beispiel:
select * from BUS_ROUTE
where
DATE_MODIFIED>=TO_DATE('12.07.2023 00:00:00', 'DD.MM.YYYY HH24:MI:SS')
AND
DATE_MODIFIED<=TO_DATE('12.07.2023 23:59:29', 'DD.MM.YYYY HH24:MI:SS') --NOSIM
Wird der SQL oben in reinem Oracle oder Postgres (oder in MapEdit mit der Option --NOSIM) ausgeführt dann kommt bei Oracle das richtige Ergebnis zurück während bei Postgres kein Ergebnis gefunden wird auch wenn man annehmen dürfte das hier das richtige Ergebnis zurück kommen müsste.
SQLite:
Die Funktion heist in SQLite "date()"
SQLServer:
Hat kein TO_DATE die Funktion heißt dort CONVERT(datetime, text)
Der Text muss im Format Jahr Monat Tag Stunde Minute Sekunde sein.
Beispiele:
SELECT CONVERT(DATETIME, '2012-06-30 11:10');
SELECT CONVERT(DATETIME, '2012-06-30 11:10:09');
SELECT CONVERT(DATETIME, '2012-06-30 11:10:09.333');
SELECT CONVERT(DATETIME, '2012/06/30 11:10:09.333');
SELECT CONVERT(DATETIME, '2012.06.30 11:10:09.333');
LISTAGG Ausdruck
Nur Oracle kennt LISTAGG. Für Postgres und SQLServer wird LISTAGG in STRING_AGG umgewandelt. Für SQLite wird MapEdit eigene SQLite Extension Funktion STRING_AGG verwendet.
STRING_AGG
Nur Postgres und SQLServer kennen den STRING_AGG Befehl. Für Oracle wird STRING_AGG in LISTAGG umgewandelt. Für SQLite wird MapEdit eigene SQLite Extension Funktion STRING_AGG verwendet.
SDO_AREA
Postgres: Die Funktion ST_Area(geom) wird benutzt, parameter werden ignoriert.
SQLServer: Die Funktion geom.STArea() wird benutzt.
SQLite: Die Extension Funktion ST_AREA wird benutzt.
SDO_INTERSECTION
Postgre: Die Funktion ST_Intersect(geom1,geom2) wird benutzt.
SQLServer: Die Funktion geom.stinteresect(othergeom)=1 wird benutzt.
SQLite: Die Extension Funktion ST_Intersection wird benutzt.
SDO_DISTANCE
Postgre: Die Funktion ST_Distance wird benutzt.
SQLServer: Die Funktion geom.STDistance(othergeom) wird benutzt.
SQLite: Die Extension Funktion ST_Distance wird benutzt.
SDO_WITHIN_DISTANCE
Postgre: Die Funktion ST_Dwithin wird benutzt.
SQLite: Die Extension Funktion ST_Distance wird benutzt.
SQLServer: Die Funktion geom.STDistance(othergeom) wird benutzt.
SDO_RELATE
SQLite: Die Extension SDO_RELATE wird benutzt. Es werden aber nur die Masken ANYINTERACT und INSIDE unterstützt.
Postgre: Maske TOUCH wird in ST_Touches umgewandelt Maske EQUAL wird in ST_Equals umgewandelt Maske CONTAINS wird in ST_Contains umgewandelt Maske INSIDE wird in ST_Within umgewandelt Maske COVEREDBY wird in ST_CoveredBy umgewandelt Maske COVERS wird in ST_Covers umgewandelt Maske ANYINTERACT wird in ST_Intersects umgewandelt Maske OVERLAPBDYDISJOINT wird in ST_Intersects and not ST_Contains umgewandelt Maske OVERLAPBDYINTERSECT wird in ST_Intersects AND ST_Contains umgewandelt
Wird keine dieser Masken gefunden wird ST_Intersects benutzt. Masken können kombiniert werden. Masken die nicht aufgeführt sind können nicht genutzt werden.
SQLServer:
Maske TOUCH wird in STTouches umgewandelt Maske EQUAL wird in STEquals umgewandelt Maske CONTAINS wird in STContains umgewandelt Maske INSIDE wird in STWithin umgewandelt Maske ANYINTERACT wird in STIntersects umgewandelt Maske OVERLAPBDYDISJOINT wird in STIntersects and not STContains umgewandelt Maske OVERLAPBDYINTERSECT wird in STIntersects AND STContains umgewandelt
Wird keine dieser Masken gefunden wird STIntersects benutzt. Masken können kombiniert werden. Masken die nicht aufgeführt sind können nicht genutzt werden.
DUAL Table
Die Pseudo Tabelle "DUAL" existiert nur in Oracle. Alle anderen Datenbanksysteme kennen diese Hilfstabelle nicht bzw. dort kann das gleiche ohne Angabe einer Tabelle erreicht werden.
In MapEdit Datastrukturen wird jedoch immer eine Tabelle mit dem Namen DUAL erzeugt. Diese Tabelle ist schreibgeschützt! Dadurch kann diese in allen Datenbanksystem als Hilfstabelle verwendet werden und SQLs die auf Oracle ausgelegt sind funktionieren auch in diesen Datenbanken.
Wenn --NOMEFUN verwendet wird dann wird in nicht Oracle Datenbanken der Teil "FROM DUAL" am ende eines SQL entfernt.
LIKE
SQLite hat von sich aus einen Like Operator, dieser funktioniert jedoch nicht mit Umlauten und ist nicht case sensitive. Deswegen hat MapEdit eine eigene Extension Funktion die Umlaute unterstützt und case sensitive ist.
LIMIT
Oracle: wir in "rownum<n" umgewandelt.
SQLServer: wird in "select top n" umgewandelt
sequence.NEXTVAL
SQLite: Hat keine Sequencen. MapEdit Simuliert diese jedoch mittels der Hilfstabelle ME_SEQUENCE_EMULATION und der Extetion Funktion NEXTVAL.
ROWNUM (to Limit Records)
Postgres, SQLite und SQLServer: rownum<n wird in ein LIMIT Statement umgewandelt. Funktioniert aber nur wenn "rownum<n" ganz am Ende des SQLs steht. Folgender Ausdruck wird zum Beispiel nicht unterstützt.
where rownum<10 order by ID
Paramter (Scripting und Programmierung)
Beachten sie das Paramter in SQL Befehlen je nach Datenbank anders sind.
Oracle verwendet das ":" Zeichen
select fid from strassen where name=:strname and length > :strlen
Bei den Funktionen muss der Parametername ohne ":" anfangen.
Postgres verwendet das ":" Zeichen
select fid from strassen where name=:strname and length > :strlen
Auch bei den Funktionen muss der Parameter mit ":" anfangen.
SQLite verwendet das "$" Zeichen
select fid from strassen where name=$strname and length > $strlen
Auch bei den Funktionen muss der Parameter mit "$" anfangen.
SQLServer verwendet z.B. das "@" Zeichen
select fid from strassen where name=@strname and length > @strlen
Auch bei den Funktionen muss der Parameter mit "@" anfangen.
Wenn sie MapEdit API Funktionen wie SqlQuery verwenden, geben sie bitte immer die Oracle schreibweise mit ":" an. MapEdit wandelt den Parameter dann automatisch in die richtige Syntax der jeweiligen Datenbank um.
Ich will ein übersetzen meines SQLs verhindern
Wenn man will das MapEdit einem den SQL nicht übersetzen soll, dann kann ganz hinten im SQL folgendes angeben
-–NOSIM
Die steht fuer "No Simulation"
Ausnahme: Upper/Lower/Like bei SQLITE werden damit nicht abgeschalten.
MapEdit
Wenn --NOMEFUN
gesetzt ist dann findet beim SQL keine automatische
Übersetzung folgender Funktionen statt:
Bei SQLite die Extension SQLite Funktionen: ME_UPPER, ME_LOWER, ME_LPAD, ME_RPAD, ME_INITCAP nicht genutzt und die jeweiligen Orginalen Funktionen verwendet.
Bei SQLServer die Stored Procedure Funtionen:
me_initcap, me_lpad, me_rpad
Besondere MapEdit Funktionen in Postgres
me_isnumeric prüft ob ein text eine zahl ist.
me_isdate prüft ob ein text ein Datum ist.
Tabellen Name ändern
SQL Server:
sp_rename 'old_table_name', 'new_table_name';
Spalten Name ändern
SQL Server:
sp_rename 'table_name.old_column_name', 'new_column_name', 'COLUMN';
Datentypen ändern bei SQLite
Das ändern eines NULL Types in NOT NULL und umgekehrt und das aendern von Default Werten geht bei SQLIte nur durch neuanlegen der ganzen Tabelle. Wird der AppBuilder verwendet, macht MapEdit diese im Hintergrund.
Datenstruktur anlegen und ändern
Verwenden Sie immer MapEdit AppBuilder um Datenstruturen anzulegen und zu ändern.
Verwenden Sie keine dritt Hersteller Werkzeuge wie pgAdmin, DBeaver etc oder manuelle SQLs.
Diese Tools legen ggf Datatypen an die MapEdit nicht unterstützt.
Manche Tools erzeugen Tabellen und /oder Spalten in '' Zeichen was zu
abstürzen oder nicht funktionierenden Abfragen fuehren kann.
Views bitte immer mit dem AppBuilder anlegen.
Die Verwendung von nicht Datenbank Spezifischer Syntax in Views funktionier nicht.