

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de expresiones de regla de transformación para definir el contenido de columnas
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions"></a>

Para definir contenido para columnas nuevas y existentes, puede utilizar una expresión dentro de una regla de transformación. Por ejemplo, mediante expresiones puede agregar una columna o replicar encabezados de tabla de origen a un destino. También puede utilizar expresiones para marcar registros en tablas de destino como insertados, actualizados o eliminados en el origen. 

**Topics**
+ [Agregar una columna mediante una expresión](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding)
+ [Marcar registros de destino mediante una expresión](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging)
+ [Replicación de encabezados de tablas de origen mediante expresiones](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers)
+ [Uso de SQLite funciones para crear expresiones](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite)
+ [Agregar metadatos a una tabla de destino mediante expresiones](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata)

## Agregar una columna mediante una expresión
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding"></a>

Para agregar columnas a tablas mediante una expresión en una regla de transformación, utilice una acción de regla `add-column` y un destino de regla `column`.

En el ejemplo siguiente se agrega una nueva columna a la tabla `ITEM`. Establece el nuevo nombre de columna en `FULL_NAME`, con un tipo de datos de `string`, 50 caracteres de longitud. La expresión concatena los valores de dos columnas existentes, `FIRST_NAME` y `LAST_NAME`, para evaluar `FULL_NAME`. Los parámetros `schema-name`, `table-name` y de expresión hacen referencia a los objetos de la tabla de la base de datos de origen. `Value` y el bloque `data-type` hacen referencia a los objetos en la tabla de la base de datos de destino.

```
{
    "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
            }
        }
    ]
}
```

## Marcar registros de destino mediante una expresión
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging"></a>

Para marcar los registros de las tablas de destino como insertados, actualizados o eliminados en la tabla de origen, utilice una expresión en una regla de transformación. La expresión utiliza una función `operation_indicator` para marcar registros. Los registros eliminados del origen no se eliminan del destino. En su lugar, el registro de destino se marca con un valor proporcionado por el usuario para indicar que se eliminó del origen.

**nota**  
La función `operation_indicator` solo funciona en tablas que tienen una clave principal en la base de datos de origen y destino. 

Por ejemplo, la siguiente regla de transformación agrega primero una nueva columna `Operation` a una tabla de destino. A continuación, actualiza la columna con el valor `D` cada vez que se elimina un registro de una tabla de origen.

```
{
      "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
      }
}
```

## Replicación de encabezados de tablas de origen mediante expresiones
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers"></a>

De forma predeterminada, los encabezados de las tablas de origen no se replican en el destino. Para indicar qué encabezados replicar, utilice una regla de transformación con una expresión que incluya el encabezado de columna de tabla. 

Puede utilizar los siguientes encabezados de columna en expresiones. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.html)

En el ejemplo siguiente se agrega una nueva columna al destino mediante el valor de posición de flujo del origen. Para SQL Server, el valor de posición de flujo es el LSN para el punto de conexión de origen. Para Oracle, el valor de posición de flujo es el SCN para el punto de conexión de origen.

```
{
      "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
      }
    }
```

El siguiente ejemplo agrega una nueva columna al destino que tiene un número creciente único del origen. Este valor representa un número único de 35 dígitos en el nivel de tarea. Los primeros 16 dígitos forman parte de una marca temporal y los últimos 19 dígitos son el número record\$1id incrementado por DBMS.

```
{
"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
}
}
```

## Uso de SQLite funciones para crear expresiones
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite"></a>

Puede utilizar table-settings para especificar cualquier configuración que desee aplicar a la tabla o vista seleccionada para una operación específica. Las reglas de table-settings son opcionales. 

**nota**  
En lugar del concepto de tablas y vistas, las bases de datos MongoDB y DocumentDB almacenan los registros de datos como documentos que se agrupan en *recopilaciones*. Por lo tanto, al migrar desde un origen de MongoDB o DocumentDB, considere el tipo de segmentación por rango de la configuración de carga paralela para *recopilaciones* seleccionadas en lugar de tablas y vistas.

**Topics**
+ [Uso de una expresión CASE](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE)
+ [Ejemplos](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex)

A continuación, encontrará funciones de cadena que puede utilizar para crear expresiones de reglas de transformación.


| Funciones de cadena | Description (Descripción) | 
| --- | --- | 
|  `lower(x)`  |  La función `lower(x)` devuelve una copia de la cadena *`x`* con todos los caracteres convertidos a minúsculas. La función `lower` integrada de forma predeterminada solo funciona con caracteres ASCII.  | 
|  `upper(x)`  |  La función `upper(x)` devuelve una copia de la cadena *`x`* con todos los caracteres convertidos a mayúsculas. La función `upper` integrada de forma predeterminada solo funciona con caracteres ASCII.  | 
|  `ltrim(x,y)`  |  La función `ltrim(x,y)` devuelve una cadena formada al eliminar todos los caracteres que aparecen en y desde el lado izquierdo de x. Si no hay ningún valor para y, `ltrim(x)` elimina los espacios del lado izquierdo de x.  | 
|  `replace(x,y,z)`  |  La función `replace(x,y,z)` devuelve una cadena formada al sustituir la cadena z por cada aparición de la cadena y en la cadena x.  | 
| `rtrim(x,y)` |  La función `rtrim(x,y)` devuelve una cadena formada al eliminar todos los caracteres que aparecen en y desde el lado derecho de x. Si no hay ningún valor para y, `rtrim(x)` elimina los espacios del lado derecho de x.  | 
| `substr(x,y,z)` |  La función `substr(x,y,z)` devuelve una subcadena de la cadena de entrada `x` que comienza con el carácter `y` y que tiene una longitud de *`z`* caracteres.  Si *`z`* se omite, `substr(x,y)` devuelve todos los caracteres hasta el final de la cadena que `x` comienza por el carácter `y`. El carácter situado más a la izquierda de `x` es el número 1. Si *`y`* es negativo, el primer carácter de la subcadena se encuentra contando desde la derecha y no desde la izquierda. Si *`z`* es negativo, se devuelven los caracteres `abs(z)` que preceden al carácter `y`. Si `x` es una cadena, los índices de los caracteres se refieren a los caracteres UTF-8 reales. Si `x` es un BLOB, los índices se refieren a bytes.  | 
| trim(x,y) |  La función `trim(x,y)` devuelve una cadena formada al eliminar todos los caracteres que aparecen en `y` desde ambos lados de `x`. Si no hay ningún valor para `y`, `trim(x)` elimina los espacios desde ambos lados de `x`.  | 

A continuación, puede encontrar funciones de LOB que puede utilizar para crear expresiones de reglas de transformación.


| Funciones de LOB | Description (Descripción) | 
| --- | --- | 
|  `hex(x)`  |  La función `hex` recibe un BLOB como argumento y devuelve una versión de cadena hexadecimal en mayúscula del contenido del BLOB.  | 
|  `randomblob (N)`  |  La función `randomblob(N)` devuelve un BLOB de `N` bytes que contiene bytes pseudoaleatorios. Si *N* es menor que 1, se devuelve un BLOB aleatorio de 1 byte.   | 
|  `zeroblob(N)`  |  La función `zeroblob(N)` devuelve un BLOB que consta de `N` bytes de 0x00.  | 

A continuación, puede encontrar funciones numéricas que puede utilizar para crear expresiones de reglas de transformación.


| Funciones numéricas | Description (Descripción) | 
| --- | --- | 
|  `abs(x)`  |  La función `abs(x)` devuelve el valor absoluto del argumento numérico `x`. La `abs(x)` función devuelve NULL si *x* es NULL. La `abs(x)` función devuelve 0.0 si **x** es una cadena o un BLOB que no se puede convertir en un valor numérico.  | 
|  `random()`  |  La función `random` devuelve un entero pseudoaleatorio comprendido entre -9,223,372,036,854,775,808 y \$19,223,372,036,854,775,807.  | 
|  `round (x,y)`  |  La `round (x,y)` función devuelve un valor de punto flotante *x* redondeado a *y* dígitos a la derecha de la coma decimal. Si no hay ningún valor para*y*, se supone que es 0.  | 
|  `max (x,y...)`  |  La función `max` de multiargumento devuelve el argumento con el valor máximo o devuelve NULL si algún argumento es NULL.  La función `max` busca en sus argumentos de izquierda a derecha un argumento que defina una función de clasificación. Si encuentra uno, utiliza esa función de clasificación para todas las comparaciones de cadenas. Si ninguno de los argumentos en `max` define una función de clasificación, se utiliza la función de clasificación `BINARY`. La función `max` es simple cuando tiene dos o más argumentos, pero funciona como una función agregada si tiene un solo argumento.  | 
|  `min (x,y...)`  |  La función `min` multiargumento devuelve el argumento con el valor mínimo.  La función `min` busca en sus argumentos de izquierda a derecha un argumento que defina una función de clasificación. Si encuentra uno, utiliza esa función de clasificación para todas las comparaciones de cadenas. Si ninguno de los argumentos en `min` define una función de clasificación, se utiliza la función de clasificación `BINARY`. La función `min` es simple cuando tiene dos o más argumentos, pero funciona como una función agregada si tiene un solo argumento.   | 

A continuación, puede encontrar funciones de comprobación NULL que puede utilizar para crear expresiones de reglas de transformación.


| Funciones de comprobación NULL | Description (Descripción) | 
| --- | --- | 
|  `coalesce (x,y...)`  |  La función `coalesce` devuelve una copia de su primer argumento distinto de NULL, pero devuelve NULL si todos los argumentos son NULL. La función de unión tiene al menos dos argumentos.  | 
|  `ifnull(x,y)`  |  La función `ifnull` devuelve una copia del primer argumento distinto de NULL, pero devuelve NULL si todos los argumentos son NULL. La función `ifnull` tiene exactamente dos argumentos. La función `ifnull` es la misma que `coalesce` con dos argumentos.  | 
|  `nullif(x,y)`  |  La función `nullif(x,y)` devuelve una copia del primer argumento si los argumentos son diferentes, pero devuelve NULL si los argumentos son iguales.  La función `nullif(x,y)` busca en sus argumentos de izquierda a derecha un argumento que defina una función de clasificación. Si encuentra uno, utiliza esa función de clasificación para todas las comparaciones de cadenas. Si ninguno de los argumentos en nullif define una función de clasificación, se utiliza la función de clasificación `BINARY`.  | 

A continuación, puede encontrar funciones de fecha y hora que puede utilizar para crear expresiones de reglas de transformación.


| Funciones de fecha y hora | Description (Descripción) | 
| --- | --- | 
|  `date(timestring, modifier, modifier...)`  |  La `date` función devuelve la fecha en el formato YYYY-MM-DD.  | 
|  `time(timestring, modifier, modifier...)`  |  La función `time` devuelve la hora en el formato HH:MM:SS.  | 
|  `datetime(timestring, modifier, modifier...)`  |  La `datetime` función devuelve la fecha y la hora en el formato YYYY-MM-DD HH:MM:SS.  | 
|  `julianday(timestring, modifier, modifier...)`  |  La función `julianday` devuelve el número de días transcurridos desde el mediodía en Greenwich el 24 de noviembre de 4714 a. C.  | 
|  `strftime(format, timestring, modifier, modifier...)`  |  La función `strftime` devuelve la fecha según la cadena de formato especificada como primer argumento y utiliza una de las siguientes variables: `%d`: día del mes `%H`: hora 00-24 `%f`: \$1\$1 fracciones de segundo SS.SSS `%j`: día del año de 001 a 366 `%J`: \$1\$1 número de día juliano `%m`: mes 01-12 `%M`: minuto 00-59 `%s`: segundos desde 1970-01-01 `%S`: segundos 00-59 `%w`: día de la semana 0–6 domingo==0 `%W`: semana del año 00-53 `%Y`: año 0000-9999 `%%`: %  | 

A continuación, puede encontrar una función de inserción que puede utilizar para crear expresiones de reglas de transformación.


| Función de inserción | Description (Descripción) | 
| --- | --- | 
|  `hash_sha256(x)`  |  La función `hash` genera un valor de inserción para una columna de entrada (mediante el algoritmo SHA-256) y devuelve el valor hexadecimal del valor de inserción generado.  Para usar la función `hash` en una expresión, agregue `hash_sha256(x)` a la expresión y sustituya *`x`* por el nombre de la columna de origen.  | 

### Uso de una expresión CASE
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE"></a>

La SQLite `CASE` expresión evalúa una lista de condiciones y devuelve una expresión basada en el resultado. La sintaxis se muestra a continuación.

```
    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
```

### Ejemplos
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex"></a>

**Example de agregar una nueva columna de cadenas a la tabla de destino mediante una condición que distingue entre mayúsculas y minúsculas**  
La siguiente regla de transformación de ejemplo agrega una nueva columna de cadena, `emp_seniority`, a la tabla de destino, `employee`. Utiliza la SQLite `round` función de la columna de salarios, con una condición de mayúsculas y minúsculas para comprobar si el salario es igual o superior a 20 000. Si es así, la columna obtiene el valor `SENIOR` y cualquier otra columna tiene el valor `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",
        "length": 50
      }

  }
```

**Example Ejemplo de agregación de una nueva columna de cadena a la tabla de destino mediante la función SUBSTR**  
El siguiente ejemplo de regla de transformación agrega una nueva columna de cadena mediante SQLite operadores o funciones para definir los datos de una columna. Este enfoque implica el uso de SQLite funciones para transformar los datos GUID cargados desde Oracle al formato UUID antes de insertarlos en la tabla de destino de Postgresql.  
La siguiente regla utiliza las funciones de SQLite subcadena (SUBSTR), función hexadecimal (HEX) y minúscula (LOWER) para dividir los datos GUID en varios grupos separados por guiones, específicamente un grupo de 8 dígitos seguido de tres grupos de 4 dígitos seguidos de un grupo de 12 dígitos, para un total de 32 dígitos que representan los 128 bits.  
A continuación se muestra un ejemplo de datos de origen y salida en el procesamiento posterior de destino mediante la regla de transformación:  
**Tabla de origen (formato GUID de Oracle)**    
T\$1 COL2  

```
06F6949D234911EE80670242AC120002
1A2B3C4D5E6F11EE80670242AC120003
F5E4D3C2B1A011EE80670242AC120004
```
**Tabla de destino (formato UUID de PostgreSQL)**    
T\$1 \$1TMP COL2  

```
06f6949d-2349-11ee-8067-0242ac120002
1a2b3c4d-5e6f-11ee-8067-0242ac120003
f5e4d3c2-b1a0-11ee-8067-0242ac120004
```

```
{
  "rule-type": "transformation",
  "rule-id": "2",
  "rule-name": "2",
  "rule-action": "add-column",
  "rule-target": "column",
  "object-locator": {
    "schema-name": "SPORTS",
    "table-name": "TEST_TBL_2"
  },
  "value": "t_col2_tmp",
  "expression": "CASE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) WHEN '----' THEN NULL ELSE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) END",
  "data-type": {
    "type": "string",
    "length": 60
  }
}
```

**Example de agregar una nueva columna de fecha a la tabla de destino**  
En el ejemplo siguiente se agrega una nueva columna de fecha, `createdate`, a la tabla de destino, `employee`. Al utilizar la función de SQLite fecha`datetime`, la fecha se añade a la tabla recién creada para cada fila insertada.  

```
  {
      "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
      }
  }
```

**Example de agregar una nueva columna numérica a la tabla de destino**  
En el ejemplo siguiente se agrega una nueva columna numérica, `rounded_emp_salary`, a la tabla de destino, `employee`. Utiliza la SQLite `round` función para añadir el salario redondeado.   

```
  {
      "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"
      }
  }
```

**Example de agregar una nueva columna de cadenas a la tabla de destino mediante la función de inserción**  
En el ejemplo siguiente se agrega una nueva columna de cadena, `hashed_emp_number`, a la tabla de destino, `employee`. La SQLite `hash_sha256(x)` función crea valores cifrados en el destino de la columna de origen,`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",
        "length": 64
      }
  }
```

## Agregar metadatos a una tabla de destino mediante expresiones
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata"></a>

Puede agregar la información de los metadatos a la tabla de destino mediante las siguientes expresiones:
+ `$AR_M_SOURCE_SCHEMA`: el nombre del esquema de origen.
+ `$AR_M_SOURCE_TABLE_NAME`: el nombre de la tabla de origen.
+ `$AR_M_SOURCE_COLUMN_NAME`: el nombre de una columna de la tabla de origen.
+ `$AR_M_SOURCE_COLUMN_DATATYPE`: el tipo de datos de una columna en la tabla de origen.

**Example de agregar una columna para un nombre de esquema mediante el nombre de esquema del origen**  
En el ejemplo siguiente se agrega una nueva columna denominada `schema_name` al destino mediante el nombre de esquema del origen.  

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