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;