SnowConvert AI - Redshift - Basic elements¶
名称和标识符¶
Names and identifiers translation for Redshift
描述 ¶
名称标识数据库对象,包括表和列,以及用户和密码。术语 name 和 identifier 可以互换使用。标识符有两种类型:标准标识符以及引号标识符或分隔标识符。标识符必须仅包含 UTF-8 可打印字符。标准标识符和分隔标识符中的 ASCII 字母不区分大小写,并在数据库中转换为小写形式。(Redshift SQL 语言参考“名称和标识符” (https://docs.aws.amazon.com/redshift/latest/dg/r_names.html))。
标准标识符 ¶
标准 SQL 标识符遵守一系列规则,必须:
- 以 ASCII 单字节字母字符或下划线字符开头,或以长度为两到四字节的 UTF-8 多字节字符开头。 
- 后续字符可以是 ASCII 单字节字母数字字符、下划线或美元符号,也可以是长度为两到四字节的 UTF-8 多字节字符。 
- 长度介于 1 到 127 字节之间,不包括分隔标识符的引号。 
- 不包含引号和空格。 
- 不是保留的 SQL 关键字。(Redshift SQL 语言参考“标准标识符” (https://docs.aws.amazon.com/redshift/latest/dg/r_names.html#r_names-standard-identifiers)) 
Note
Snowflake 完全支持此语法。
特殊字符标识符 ¶
在 Redshift 中,支持使用一些特殊字符作为标识符名称的一部分。它们可以用于标识符的任何部分。因此,要模拟此行为,请将这些不支持的特殊字符替换为 Snowflake 中有效的新值。
- # 字符替换为 _H_。 
备注
在 Redshift 中,如果指定以 “#” 开头的表名,则该表将作为临时表创建。
示例源模式¶
输入代码:¶
Redshift¶
 CREATE TABLE #TABLE_NAME
(
    COL#1 int,
    "col2#" int
);
INSERT INTO #TABLE_NAME(COL#1, "col2#") VALUES (1,20),(2,21),(3,22);
SELECT col#1, "col2#" as col# FROM #TABLE_NAME;
输出代码:¶
Snowflake¶
 CREATE TEMP TABLE _H_TABLE_NAME
(
	COL_H_1 int,
	"col2#" int
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/04/2025",  "domain": "test" }}';
INSERT INTO _H_TABLE_NAME (COL_H_1, "col2#") VALUES (1,20),(2,21),(3,22);
SELECT
	col_H_1,
	"col2#" as col_H_
FROM
	_H_TABLE_NAME;
分隔标识符 ¶
分隔标识符(也称为引号标识符)以双引号 (") 开头和结尾。如果您使用的是分隔标识符,则每次引用该对象时都必须使用双引号。标识符可以包含除双引号本身之外的任何标准 UTF-8 可打印字符。因此,您可以创建包含其他非法字符(例如空格或百分号)的列名或表名。(Redshift SQL 语言参考“分隔标识符” (https://docs.aws.amazon.com/redshift/latest/dg/r_names.html#r_names-delimited-identifiers))。
在 Redshift 中,标识符可以放在引号内,并且 默认情况下不区分大小写 (https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。但是,在 Snowflake 中,标识符 默认情况下区分大小写 (https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。因此,为了模拟此行为,我们将删除所有符合以下条件的标识符中的引号:这些标识符 放在引号内,不是 Snowflake 中的保留关键字,并且包含字母数字字符。Snowflake 中的 保留 关键字 将始终放在双引号内并以小写形式定义。
警告
如果在配置中将 enable_case_sensitive_identifier (https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html) 标志设置为 true,则此更改可能会影响所需的行为。未来的更新将允许用户为这些标识符定义所需的转换。
示例源模式¶
在这种情况下,请记住,在 Snowflake 中,“LATERAL”和“INCREMENT”是保留字,而“LOCAL”不是保留字。
输入代码:¶
Redshift¶
 CREATE TABLE lateral
(
    INCREMENT int,
    "local" int
);
INSERT INTO lateral(INCREMENT, "local") VALUES (1,20),(2,21),(3,22);
SELECT lateral.INCREMENT, "local" FROM LATERAL;
Result¶
| increment | local | 
|---|---|
| 1 | 20 | 
| 2 | 21 | 
| 3 | 22 | 
输出代码:¶
Snowflake¶
 CREATE TABLE "lateral"
(
    "increment" int,
    local int
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "12/10/2024",  "domain": "test" }}';
INSERT INTO "lateral" ("increment", local) VALUES (1,20),(2,21),(3,22);
SELECT
    "lateral"."increment",
    local
FROM
    "lateral";
Result¶
| increment | LOCAL | 
|---|---|
| 1 | 20 | 
| 2 | 21 | 
| 3 | 22 | 
函数中的引号标识符¶
在 Redshift 中,函数名称可以放在引号内,并且 默认情况下不区分大小写 (https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。但是,在 Snowflake 中,如果函数放在引号内并以小写形式书写,则可能会导致问题。因此,在 Snowflake 中,任何放在引号内的函数名称将始终转换为大写,引号将会删除。
示例源模式¶
输入代码:¶
Redshift¶
 SELECT "getdate"();
Result¶
| "GETDATE"() | 
|---|
| 2024-11-21 22:08:53.000000 | 
输出代码:¶
Snowflake¶
 SELECT GETDATE();
Result¶
| "GETDATE"() | 
|---|
| 2024-11-21 22:08:53.000 +0000 | 
建议¶
To work around this limitation, Snowflake provides the QUOTED_IDENTIFIERS_IGNORE_CASE session parameter, which causes Snowflake to treat lowercase letters in double-quoted identifiers as uppercase when creating and finding objects.
保留的关键字¶
Reserved keywords translation for Redshift
描述¶
在 Redshift 中,您可以使用某些 Snowflake 保留关键字 作为列名、表名等。因此,必须将这些关键字放在双引号内,才能使用这些关键字。
备注
请注意,在 Snowflake 中,当这些名称放在双引号内时,这些名称 区分大小写。因此,必须强调的是,当在 Snowflake 中使用保留关键字时,保留关键字总是会放在双引号内并转换为小写形式。有关更多信息,请参阅 Snowflake 标识符文档。
示例源模式¶
输入代码:¶
Redshift¶
 CREATE TABLE alter
(
    alter INT
);
CREATE TABLE CONNECT
(
    CONNECT INT
);
DROP TABLE alter;
DROP TABLE CONNECT;
输出代码:¶
Snowflake¶
 CREATE TABLE "alter"
(
    "alter" INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}';
CREATE TABLE "connect"
(
    "connect" INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}';
DROP TABLE "alter";
DROP TABLE "connect";
已知问题 ¶
未发现任何问题。