使用转换规则表达式定义列内容 - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用转换规则表达式定义列内容

要定义新列和现有列的内容,可以在转换规则中使用表达式。例如,使用表达式,您可以添加列或将源表标头复制到目标。您还可以使用表达式将目标表上的记录标记为在源中插入、更新或删除。

使用表达式添加列

要使用转换规则中的表达式向表添加列,请使用 add-column 规则操作和 column 规则目标。

以下示例将新列添加到 ITEM 表中。它将新列名称设置为 FULL_NAME,数据类型为 string,长度为 50 个字符。此表达式连接两个现有列 LAST_NAMEFIRST_NAME 的值,以便计算结果为 FULL_NAME。这些区域有:schema-nametable-name,表达式参数引用源数据库表中的对象。Valuedata-type块引用目标数据库表中的对象。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "Test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-column", "rule-target": "column", "object-locator": { "schema-name": "Test", "table-name": "ITEM" }, "value": "FULL_NAME", "expression": "$FIRST_NAME||'_'||$LAST_NAME", "data-type": { "type": "string", "length": 50 } } ] }

使用表达式标记目标记录

要将目标表中的记录标记为在源表中插入、更新或删除,请在转换规则中使用表达式。表达式使用 operation_indicator 函数来标记记录。从源中删除的记录不会从目标中删除。而是使用用户提供的值标记目标记录,以指示该记录已从源中删除。

注意

operation_indicator 函数仅适用于具有主键的表。

例如,以下转换规则首先将新的 Operation 列添加到目标表中。然后,只要从源表中删除记录,它就会更新具有值 D 的列。

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "add-column", "value": "Operation", "expression": "operation_indicator('D', 'U', 'I')", "data-type": { "type": "string", "length": 50 } }

使用表达式复制源表标头

默认情况下,源表的标头不会复制到目标。要指示要复制哪些标头,请将转换规则与包含表列标头的表达式结合使用。

您可以在表达式中使用以下列标头。

标头 正在进行的复制中的值 完全加载中的值 数据类型
流位置 来自源的流位置值。此值可能是系统更改号 (SCN) 或日志序列号 (LSN),具体取决于源终端节点。 空字符串。 STRING
时间戳 指示更改时间的时间戳。 指示当前时间数据到达目标。 日期时间(比例 =7)
提交时间戳 指示提交时间的时间戳。 指示当前时间的时间戳。 日期时间(比例 =7)
AR_H__操作 INSERT、UPDATE 或 DELETE INSERT STRING
用户 源提供的有关进行更改的用户的用户名、ID 或任何其他信息。

此标头仅在 SQL Server 和 Oracle(版本 11.2.0.3 及更高版本)源终端节点上受到支持。

要应用于对象的转换。转换规则操作区分大小写。 STRING
更改序列 来自源数据库的唯一递增编号,由时间戳和自动递增数字组成。该值取决于源数据库系统。 空字符串。 STRING

以下示例通过使用源中的流位置值向目标添加新列。对于 SQL Server,流位置值是源终端节点的 LSN。对于 Oracle,流位置值是源终端节点的 SCN。

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "add-column", "value": "transact_id", "expression": "$AR_H_STREAM_POSITION", "data-type": { "type": "string", "length": 50 } }

以下示例将新列添加到目标中,该列具有源中唯一的递增编号。此值表示任务级别的 35 位唯一数字。前 16 位数字是时间戳的一部分,最后 19 位数字是由 DBMS 递增的记录 _id 编号。

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "add-column", "value": "transact_id", "expression": "$AR_H_CHANGE_SEQ", "data-type": { "type": "string", "length": 50 } }

使用 SQLite 函数构建表达式

要构建处理源列内容的转换规则表达式,可以使用以下类型的 SQLite 函数:

  • 字符串函数

  • LOB 函数

  • 数值函数

  • NULL 检查函数

  • 日期和时间函数

  • 哈希函数

  • CASE 表达式

在下文中,您可以找到可用于构建转换规则表达式的字符串函数。

字符串函数 描述

lower(x)

这些区域有:lower(x)函数返回字符串的副本x并将所有字符转换为小写。默认值,内置lower函数仅适用于 ASCII 字符。

ltrim(x,y)

这些区域有:ltrim(x,y)函数返回通过从 x 左侧删除 y 中出现的所有字符而形成的字符串。如果没有 y 的值,ltrim(x)从 x 左侧删除空格。

replace(x,y,z)

这些区域有:replace(x,y,z)函数返回一个字符串,通过将字符串 z 替换为字符串 x 中字符串 y 的每个匹配项而形成的字符串。

rtrim(x,y)

这些区域有:rtrim(x,y)函数返回通过从 x 右侧删除 y 中出现的所有字符而形成的字符串。如果没有 y 的值,rtrim(x)从 x 右侧删除空格。

substr(x,y,z)

这些区域有:substr(x,y,z)函数返回输入字符串的子字符串x,开始于y第个字符,哪个是z字符长。

如果z被省略,substr(x,y)返回字符串末尾的所有字符xyTh 个字符。最左边的字符x是数值 1。如果y为负数,则通过从右而不是左计数来找到子字符串的第一个字符。如果z为负数,则abs(z)前面的字符y返回第个字符。如果x是一个字符串,那么字符的索引是实际的 UTF-8 字符。如果x是 BLOB,那么索引引用字节。

trim(x,y)

这些区域有:trim(x,y)函数返回一个字符串,通过删除y从两侧x. 如果没有ytrim(x)删除x.

replaceChars(X,Y,Z)

这些区域有:replaceChars(X,Y,Z)函数替换字符串中的任何字符X,它也存在于字符串Y(要替换的字符)与Z(替换字符)在同一位置。此函数对于从路径和文件名中删除无效的字符特别有用。

如果是字符串Z不包含在字符串中具有相应位置的字符X,该字符串X字符被替换为字符串中的第一个字符Z.

如果是字符串X包括不存在于字符串中的字符Z,则原始字符将保持不变。

例如,指定replaceChars("abcde","abcd","123")返回1231e.

在下文中,您可以找到可用于构建转换规则表达式的 LOB 函数。

LOB 函数 描述

hex(x)

这些区域有:hex函数接收 BLOB 作为参数,并返回 BLOB 内容的大写十六进制字符串版本。

randomblob (N)

这些区域有:randomblob(N)函数返回N包含伪随机字节的字节 BLOB。如果N小于 1,则返回 1 字节随机 BLOB。

zeroblob(N)

这些区域有:zeroblob(N)函数返回一个 BLOB,该 BLOB 由N字节值为 0x00。

在下文中,您可以找到可用于构建转换规则表达式的数字函数。

数值函数 描述

abs(x)

这些区域有:abs(x)函数返回数字参数的绝对值x. 这些区域有:abs(x)函数返回 NULL,如果x为 NULL。这些区域有:abs(x)函数返回 0.0x是不能转换为数字值的字符串或 BLOB。

random()

这些区域有:random函数返回一个范围-9,2236,854,754,854,754,775,808 和 +9,225,808 之间的伪随机整数。

round (x,y)

这些区域有:round (x,y)函数返回浮点值。x四舍五入y位于小数点右侧。如果没有y,则假定为 0。

max (x,y...)

多参数max函数返回具有最大值的参数,如果任何参数为 NULL,则返回 NULL。

这些区域有:max函数从左到右搜索其参数,以查找定义归类函数的参数。如果找到一个,它将使用该排序函数进行所有字符串比较。如果没有max定义一个归类函数,BINARY排序函数。这些区域有:max函数是一个简单的函数,当它有两个或多个参数时,它是一个简单的函数,但如果它有一个参数,则它作为一个聚合函数运行。

min (x,y...)

多参数min函数返回具有最小值的参数。

这些区域有:min函数从左到右搜索其参数,以查找定义归类函数的参数。如果找到一个,它将使用该排序函数进行所有字符串比较。如果没有min定义一个归类函数,BINARY排序函数。这些区域有:min函数是一个简单的函数,当它有两个或多个参数时,它是一个简单的函数,但如果它有一个参数,则它作为一个聚合函数运行。

在下文中,您可以找到可用于构建转换规则表达式的 NULL 检查函数。

NULL 检查函数 描述

coalesce (x,y...)

这些区域有:coalesce函数返回其第一个非 NULL 参数的副本,但如果所有参数都为 NULL,则返回 NULL。合并函数至少包含两个参数。

ifnull(x,y)

这些区域有:ifnull函数返回其第一个非 NULL 参数的副本,但如果两个参数都为 NULL,则返回 NULL。这些区域有:ifnull函数有两个参数。这些区域有:ifnull函数与coalesce两个参数。

nullif(x,y)

这些区域有:nullif(x,y)函数返回其第一个参数的副本,如果参数相同,则返回 NULL。

这些区域有:nullif(x,y)函数从左到右搜索其参数,以查找定义归类函数的参数。如果找到一个,它将使用该排序函数进行所有字符串比较。如果 nullif 的参数都没有定义一个排序函数,那么BINARY排序函数。

在下文中,您可以找到可用于构建转换规则表达式的日期和时间函数。

日期和时间函数 描述

date(timestring, modifier, modifier...)

这些区域有:date函数以 YYYYYYYYYYYYYYYYYYYYYYYYYYYYY

time(timestring, modifier, modifier...)

这些区域有:time函数以 HH: MM: SS 格式返回时间。

datetime(timestring, modifier, modifier...)

这些区域有:datetime函数以 YYYY-MM-DD HH: MM: SS 的格式返回日期和时间。

julianday(timestring, modifier, modifier...)

这些区域有:julianday函数返回自公元前 4714 年 11 月 24 日在格林威治中午以来的天数

strftime(format, timestring, modifier, modifier...)

这些区域有:strftime函数使用以下变量之一,根据指定为第一个参数的格式字符串返回日期:

%d:月中的日期

%H:00—24 小时

%f: ** 小数秒 SS.SSS

%j:001-366 年中的某一天

%J: ** 朱利安日号

%m:1 至 12 个月

%M:分钟 00—59

%s:自 1970 年 1 月 1 日以来的秒数

%S:秒钟:00—59

%w: 一周中的某天 0—6 个星期日 ==0

%W: 00—53 年中的一周

%Y:0000—9999 年

%%: %

在下文中,您可以找到可用于构建转换规则表达式的哈希函数。

哈希函数 描述

hash_sha256(x)

这些区域有:hash函数为输入列生成哈希值(使用 SHA-256 算法),并返回生成的哈希值的十六进制值。

使用hash函数,在表达式中添加hash_sha256(x)添加到表达式,然后将x替换为源列名称。

使用 CASE 表达式

SQLiteCASE表达式计算条件列表并基于结果返回表达式。下面显示了语法。

CASE case_expression WHEN when_expression_1 THEN result_1 WHEN when_expression_2 THEN result_2 ... [ ELSE result_else ] END # Or CASE WHEN case_expression THEN result_1 WHEN case_expression THEN result_2 ... [ ELSE result_else ] END

Examples

例 使用大小写条件将新字符串列添加到目标表

以下示例转换规则添加了一个新的字符串列emp_seniority,添加到目标表,employee. 它使用 SQLiteround函数,并提供案例条件来检查薪金是否等于或超过 20,000。如果是这样,列将获取值SENIOR,其他任何东西都具有JUNIOR.

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-column", "rule-target": "column", "object-locator": { "schema-name": "public", "table-name": "employee" }, "value": "emp_seniority", "expression": " CASE WHEN round($emp_salary)>=20000 THEN ‘SENIOR’ ELSE ‘JUNIOR’ END", "data-type": { "type": "string", "lenght": 50 } }

例 将新日期列添加到目标表

以下示例将新日期列添加到createdate,添加到目标表,employee. 当您使用 SQLite 日期函数datetime,则会将日期添加到为插入的每一行新创建的表中。

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-column", "rule-target": "column", "object-locator": { "schema-name": "public", "table-name": "employee" }, "value": "createdate", "expression": "datetime ()", "data-type": { "type": "datetime", "precision": 6 } }

例 将新的数字列添加到目标表

以下示例添加一个新的数字列,rounded_emp_salary,添加到目标表,employee. 它使用 SQLiteround函数添加四舍五入的薪金。

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-column", "rule-target": "column", "object-locator": { "schema-name": "public", "table-name": "employee" }, "value": "rounded_emp_salary", "expression": "round($emp_salary)", "data-type": { "type": "int8" } }

例 使用散列函数将新字符串列添加到目标表

以下示例添加一个新的字符串列,hashed_emp_number,添加到目标表,employee. SQLitehash_sha256(x)函数在源列的目标上创建散列值,emp_number.

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "add-column", "rule-target": "column", "object-locator": { "schema-name": "public", "table-name": "employee" }, "value": "hashed_emp_number", "expression": "hash_sha256($emp_number)", "data-type": { "type": "string", "lenght": 50 } }