# Compound Attributes Actian Data Observability offers a **Compound Attributes** feature, which allows you to define an SQL-like expression, validate it in real-time, and inspect outputs similar to single-attribute rules. ## Adding a Compound Attribute 1. Navigate to the **Configuration** page and select the corresponding dataset. 2. Click the "**Add Compound Attribute"** button ![](../../../assets/assets/image_43.png) 3. **Define the Attribute**: * **Attribute ID**: Name the compound attribute. * **Attributes to Compound**: List the attributes to be used. * **Expression**: Enter an SQL-like expression that defines the transformation. 4. Enter an expression. Please see below for additional information on supported functions and examples of expressions ![](../../../assets/assets/image_41.png) You can validate the expression output by entering values for each corresponding attribute. When clicking on the edit field, Actian Data Observability will offer a few samples taken from the actual data to help Once the attribute is created, you can add an expectation, as shown in the section above for the single attribute. ## Important Usage Notes * As the user inputs an expression, an evaluation is done to ensure a valid SQL expression * There are some cases where the validation will pass but will fail during executions due to casting-related errors. The values should be cast appropriately to the expected type to mitigate this. The expression output must always be a string type. In case it is not, users need to cast to a string explicitly. Example: * If the expression has contains function; the output is boolean `contains( last_name , 'Smith')` The user needs to cast the value string `cast ( contains( last_name , 'Smith') as string)` * All parameters are treated as strings. The user needs to cast the parameters to the corresponding function param type. Example: * If the user wants to use the date\_add function, which takes in number and a date (which is a string) The user will need to cast `my_number` first like this: `date_add('2016-07-30', cast (my_number as int))` ## Examples ### Example 1 ```sql LENGTH(CONCAT_WS(\",\", firstname, lastname)) > 100 ``` The output expression is boolean, so it needs to be converted to string in order to become a value of a new compound attribute: ``` CAST(LENGTH(CONCAT_WS(\",\", firstname, lastname)) > 100 as STRING) ``` ### Example 2 ``` IF( DATEDIFF(current_timestamp(), orderdate) > 10 , true , false) ``` Convert boolean to string values: ``` IF( DATEDIFF(current_timestamp(), orderdate) > 10 , 'true' , 'false' ) ``` ### Example 3 ``` IF( ISNOTNULL(country) and ISNOTNULL(city) and (price <= 100)), 'true', 'false') ``` price is an attribute, so it’s value comes as a string, so it needs to be first cast to double ``` IF( ISNOTNULL(country) and ISNOTNULL(city) and (CAST(price as DOUBLE) <= 100)),'true', 'false') ```