Zum Hauptinhalt springen

Datenbanken im Vergleich

Diese Informationen spiegeln den Stand ab Version 22.2.64 wieder.

Gegenüberstellung aller Funktionen

Zeichenerklärung

SchlüsselBedeutung
XFunktion 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

NameOracleSQLitePostgreSQLServerHinweis
ASCIIX(N)XXIn SQLite "unicode"
CHRX(N)X(N)In SQLite und SQLServer "char"
CONCATX(W)XXsiehe unten
Concat mit ||XXX(N)siehe unten
INITCAPX(E)X(P)SQLite/SQLServer ME_INITCAP
INSTR(s,s)XX(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"
LENGTHXXX(N)SqlServer: "len"
LOWERX(E/W)XXsiehe unten.
LPADX(E/W)X(W)siehe unten.
LTRIMXXXX
REPEAT(W)(W)X(N)sqlserver: REPLICATE
REPLACEXXXXsiehe unten.
RPADX(E/WX(W)see unten.
RTRIMXXXX
SOUNDEXXX(P)XIn Postgres "me_soundex"
SUBSTRXXX(N/W)siehe unten. SQLServer "substring"
TRANSLATEX(E)XXin SqLite: "me_translate"
TRIMXXXX
UPPERX(E/W)XXsiehe unten

Numeric/Math Functions

NameOracleSQLitePostgreSQLServerHinweis
ABSXXXX
ACOSXXXX
ASINXXXX
ATANXXXX
ATAN2XXX(N)SqlServer: ATN2
CEILXXX(N)SqlServer: Ceiling
COSXXXX
COSHXXX-
EXPXXXX
FLOORXXXX
GREATESTX(N)X(W)siehe unten. SQLite "max"
LEASTX(N)X(W)siehe unten. SQLite "min"
LNXXX(N)SQL Server "log"
LOGXXX-
MODX(W)X(W)Sqlite und Sqlserver verwenden %
POWERXXXX
ROUND (numbers)XXXX
SIGNXXXX
SINXXXX
SINHXXX-
SQRTXXXX
TANXXXX
TANHXXX-
TRUNC (numbers)X(W)X(W)siehe unten

Numeric/ Analytic

NameOracleSQLitePostgreSQLServerHinweis
AVGXXXX
COUNTXXXX
MAXXXXX
MINXXXX
SUMXXXX

Date/Time Functions

NameOracleSQLitePostgreSQLServerHinweis
CURRENT_DATEXXX(N)SQLServer: sysdatetime()
CURRENT_TIMESTAMPXXXX
EXTRACTX-X-
LOCALTIMESTAMPX-X-
SYSDATEX(N)(N)(N)Postgre:now(),SQLServer: sysdatetime() , SQLite: datetime('now')

Conversion Functions

NameOracleSQLitePostgreSQLServerHinweis
TO_CHARX(W/E)X(W)SQLServer: No format parameter
TO_CLOBX(W)(W)(W)siehe unten
TO_DATEX(W)(W)(W)siehe unten
TO_NUMBERX(E)X(W)SqlServer: Format is ignored
TO_TIMESTAMPX-X-

Analytic Functions

NameOracleSQLitePostgreSQLServerHinweis
LISTAGGX(W/E)(W)(W)siehe unten
STRING_AGG(W)(W/E)XXsiehe unten

Advanced Functions

NameOracleSQLitePostgreSQLServerHinweis
CASE StatementXXXX
COALESCEXXXX
DECODEX(W)(W)(W)wird durch CASE WHEN ersetzt.
NULLIFXXXX
NVLX(N)(N)(N)gleich wie coalesce
NVL2X(W)(W)(W)wird durch CASE WHEN ersetzt. (Verfügbar ab Version 24.2.60)

Spatial Functions

NameOracleSQLitePostgreSQLServerHinweis
SDO_AREAX(E)(N)(W)siehe unten
SDO_INTERSECTIONX(E)(W)(W)siehe unten
SDO_DISTANCEX(E)(W)(W)siehe unten
SDO_WITHIN_DISTANCEX(E)(W)(W)siehe unten
SDO_RELATEX(E)(W)(W)eingeschränkt, siehe unten

Andere

NameOracleSQLitePostgreSQLServerHinweis
DUAL TableX(W)(W)(W)siehe unten
LIKEX(W/E)XXsiehe unten
LIMIT(W)XX(W)siehe unten
sequence.NEXTVALX(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)

AusdruckErgebnisDatenbank
CONCAT('A', null)'A'Oracle, Postgres, SQLite, SQLServer
'A'`` null
'A'`` null
'A'+nullNULLSQlServer
CONCAT(null,null)NULLOracle
CONCAT(null,null)leerer StringPostgres, 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))  
AusdruckErgebnisDatenbank
greatest(10,null,11,0,13,7)nullOracle und SQLite
greatest(10,null,11,0,13,7)13Postgres 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))  
AusdruckErgebnisDatenbank
least(10,null,11,0,13,7)nullOracle und SQLite
least(10,null,11,0,13,7)0Postgres 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

Hinweis

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.