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 MapEditDesktop/Professionalverwendet 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 intern 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, dass 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' | Oracle |
| 'A'||null | NULL | Postgres |
| 'A'+null | NULL | SQlServer |
| CONCAT(null,null) | NULL | Oracle |
| CONCAT(null,null) | leerer String | Postgres, SQLServer |
Beste Lösung:
Um NULL Werte bei Zeichenfolgen zu verhindern verwende Sie einfach COALESCE
Beispiel:
coalesce(MEIN_FELD1,'')||coalesce(MEIN_FELD1,'')
coalesce liefert den ersten wert zurück der nicht NULL ist. d.h. wenn Wenn MEIN_FELD1 NULL ist dann liefert coalesce '' zurück ansonsten den Wert von MEIN_FELD1.
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 heißt 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 heißt 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 heißt 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 heißt 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.
Beispiel:
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 heißt 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.