SnowConvert AI – PostgreSQL –Zeichenfolgenvergleich¶
In PostgreSQL und PostgreSQL-basierten Sprachen (Greenplum, RedShift, Netezza) werden beim Vergleichen von Datentypen fester Länge (CHAR, CHARACTER usw.) oder beim Vergleichen von Datentypen mit fester Länge mit „varchar“-Datentypen nachstehende Leerzeichen ignoriert. Dies bedeutet, dass eine Zeichenfolge wie 'water ' (Wert mit einem nachstehenden Leerzeichen) als gleichwertig mit 'water' (Wert ohne nachstehendes Leerzeichen) angesehen wird.
Beim Vergleich von
CHAR(6) 'hello', which is stored as 'hello ', with one padded character
mit
CHAR(6) 'hello ', with no need to add any padding character
zeigt sich, dass sie nach dem nachstehenden Leerzeichen praktisch gleich sind.
Snowflake hingegen kennt keine Zeichentypen mit fester Länge und verfolgt bei seinem VARCHAR-Datentyp einen eher wörtlichen Ansatz, indem es Zeichenketten genau so behandelt, wie sie gespeichert sind, einschließlich aller nachstehenden Leerzeichen. Daher wird in Snowflake 'water ' nicht als gleichwertig mit 'water' betrachtet.
Um zu verhindern, dass nachstehende Leerzeichen die Ergebnisse von Zeichenkettenvergleichen bei der Konvertierung von PostgreSQL in Snowflake beeinflussen, fügt SnowConvert AI automatisch BTRIM zu den entsprechenden Vergleichen hinzu (wie unser Team festgestellt hat). Dies stellt ein konsistentes Verhalten sicher.
Beispielhafte Quellcode-Muster¶
Lassen Sie uns die folgenden Skriptdaten verwenden, um den Zeichenfolgenvergleich zu veranschaulichen.
create table table1(c1 char(2), c2 char(2), c3 VARCHAR(2), c4 VARCHAR(2));
insert into table1 values ('a','a ','a','a ');
insert into table1 values ('b','b','b','b');
NULLIF¶
Varchar-Datentyp¶
Eingabecode:
PostgreSQL¶
SELECT NULLIF(c3,c4) FROM table1;
Ausgabecode:
Snowflake¶
SELECT
NULLIF(c3,c4) FROM
table1;
Char-Datentypen¶
Eingabecode:
PostgreSQL¶
select nullif(c1,c2) AS case2 from table1;
Ausgabecode:
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
select
nullif(c1,c2) AS case2 from
table1;
GREATEST oder LEAST¶
Eingabecode:
PostgreSQL¶
select '"' || greatest(c1, c2) || '"' AS greatest, '"' || least(c1, c2) || '"' AS least from table1;
Ausgabecode:
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
select '"' || GREATEST_IGNORE_NULLS(c1, c2) || '"' AS greatest, '"' || LEAST_IGNORE_NULLS(c1, c2) || '"' AS least from
table1;