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
Copy

mit

CHAR(6) 'hello ', with no need to add any padding character
Copy

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');
Copy

NULLIF

Varchar-Datentyp

Eingabecode:

PostgreSQL
SELECT NULLIF(c3,c4) FROM table1;
Copy

Ausgabecode:

Snowflake
SELECT
NULLIF(c3,c4) FROM
table1;
Copy

Char-Datentypen

Eingabecode:

PostgreSQL
select nullif(c1,c2) AS case2 from table1;
Copy

Ausgabecode:

Snowflake
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
select
nullif(c1,c2) AS case2 from
table1;
Copy

GREATEST oder LEAST

Eingabecode:

PostgreSQL

select '"' || greatest(c1, c2) || '"' AS greatest, '"' || least(c1, c2) || '"' AS least from table1;
Copy

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;
Copy