ANSI Mode For Strings Comparison - COLLATE
This section defines the translation specification for a string in ANSI mode with the use of COLLATE.
Description
ANSI mode for string comparison and COLLATE usage
The ANSI mode string comparison will apply the COLLATE constraint to the columns or statements as required. The default case specification trim behavior may be taken into account.
Notice that in Teradata, the default case specification is 'CASESPECIFIC', the same default as in Snowflake 'case-sensitive'. Thus, these cases will not be translated with a COLLATE because it will be redundant.
Sample Source Patterns
Setup data
CREATE TABLE employees (
employee_id INTEGER NOT NULL,
first_name VARCHAR(50) NOT CASESPECIFIC,
last_name VARCHAR(50) CASESPECIFIC,
department VARCHAR(50)
);
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (1, 'George', 'Snow', 'Sales');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (2, 'John', 'SNOW', 'Engineering');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (3, 'WIlle', 'SNOW', 'Human resources ');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (4, 'Marco', 'SnoW ', 'EngineerinG');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (5, 'Mary', ' ', 'SaleS ');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (6, 'GEORGE', ' ', 'sales ');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (7, 'GEORGE ', ' ', 'salEs ');
INSERT INTO employees(employee_id, first_name, last_name, department) VALUES (8, ' GeorgE ', ' ', 'SalEs ');
INSERT INTO employees (employee_id, first_name, last_name, department) VALUES (9, 'JOHN', ' SnoW', 'IT');
INSERT INTO employees (employee_id, first_name, last_name, department) VALUES (10, 'JOHN ', 'snow', 'Finance ');
CREATE TABLE departments (
department_id INTEGER NOT NULL,
department_name VARCHAR(50) NOT CASESPECIFIC,
location VARCHAR(100) CASESPECIFIC,
PRIMARY KEY (department_id)
);
INSERT INTO departments (department_id, department_name, location) VALUES (101, 'Information Technology', 'New York');
INSERT INTO departments (department_id, department_name, location) VALUES (102, 'Human Resources', 'Chicago');
INSERT INTO departments (department_id, department_name, location) VALUES (103, 'Sales', 'San Francisco');
INSERT INTO departments (department_id, department_name, location) VALUES (104, 'Finance', 'Boston');CREATE OR REPLACE TABLE employees (
employee_id INTEGER NOT NULL,
first_name VARCHAR(50),
last_name VARCHAR(50),
department VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/02/2025", "domain": "no-domain-provided" }}'
;
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (1, 'George', 'Snow', 'Sales');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (2, 'John', 'SNOW', 'Engineering');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (3, 'WIlle', 'SNOW', 'Human resources ');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (4, 'Marco', 'SnoW ', 'EngineerinG');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (5, 'Mary', ' ', 'SaleS ');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (6, 'GEORGE', ' ', 'sales ');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (7, 'GEORGE ', ' ', 'salEs ');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (8, ' GeorgE ', ' ', 'SalEs ');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (9, 'JOHN', ' SnoW', 'IT');
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (10, 'JOHN ', 'snow', 'Finance ');
CREATE OR REPLACE TABLE departments (
department_id INTEGER NOT NULL,
department_name VARCHAR(50),
location VARCHAR(100),
PRIMARY KEY (department_id)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/02/2025", "domain": "no-domain-provided" }}'
;
INSERT INTO departments (department_id, department_name, location)
VALUES (101, 'Information Technology', 'New York');
INSERT INTO departments (department_id, department_name, location)
VALUES (102, 'Human Resources', 'Chicago');
INSERT INTO departments (department_id, department_name, location)
VALUES (103, 'Sales', 'San Francisco');
INSERT INTO departments (department_id, department_name, location)
VALUES (104, 'Finance', 'Boston');Comparison operation
Case 1: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE first_name = 'GEorge ';1
George
Snow
Sales
Snowflake
SELECT
*
FROM
employees
WHERE
COLLATE(first_name, 'en-cs-rtrim') = RTRIM('George');1
George
Snow
Sales
Case 2: Column constraint is CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE last_name = 'SNOW ';3
WIlle
SNOW
Human resources
2
John
SNOW
Engineering
Snowflake
SELECT
*
FROM
employees
WHERE
RTRIM(last_name) = RTRIM('SNOW ');3
WIlle
SNOW
Human resources
2
John
SNOW
Engineering
Case 3: CAST NOT CASESPECIFIC column to CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT * FROM employees WHERE first_name = 'George ' (CASESPECIFIC);1
George
Snow
Sales
Snowflake
SELECT
*
FROM
employees
WHERE
COLLATE(first_name, 'en-cs-rtrim') = 'George ' /*** SSC-FDM-TD0032 - CASESPECIFIC CLAUSE WAS REMOVED ***/;1
George
Snow
Sales
Case 4: CAST CASESPECIFIC column to NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT * FROM employees WHERE first_name = 'GEorge ' (NOT CASESPECIFIC) ;1
George
Snow
Sales
6
GEORGE
sales
7
GEORGE
salEs
Snowflake
SELECT
*
FROM
employees
WHERE
RTRIM(first_name) = RTRIM('GEorge ' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/);1
George
Snow
Sales
6
GEORGE
sales
7
GEORGE
salEs
Case 5: CAST NOT CASESPECIFIC column to NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT * FROM employees WHERE first_name (NOT CASESPECIFIC) = 'George ';1
George
Snow
Sales
Snowflake
SELECT
*
FROM
employees
WHERE
COLLATE(first_name /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/, 'en-cs-rtrim') = 'George ';1
George
Snow
Sales
LIKE operation
Case 1: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE first_name LIKE 'George';1
George
Snow
Sales
Snowflake
SELECT *
FROM employees
WHERE COLLATE(first_name, 'en-cs-rtrim') LIKE 'George';1
George
Snow
Sales
Case 2: Column constraint is CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE last_name LIKE 'Snow';2
John
SNOW
Engineering
3
WIlle
SNOW
Human resources
Snowflake
SELECT *
FROM employees
WHERE RTRIM(last_name) LIKE RTRIM('Snow');2
John
SNOW
Engineering
3
WIlle
SNOW
Human resources
Case 3: CAST NOT CASESPECIFIC column to CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE first_name LIKE 'Mary' (CASESPECIFIC);5
Mary
SaleS
Snowflake
SELECT
*
FROM
employees
WHERE
COLLATE(first_name, 'en-cs-rtrim') LIKE 'Mary' /*** SSC-FDM-TD0032 - CASESPECIFIC CLAUSE WAS REMOVED ***/;5
Mary
SaleS
Case 4: CAST CASESPECIFC column to NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE last_name LIKE 'SNO%' (NOT CASESPECIFIC);2
John
SNOW
Engineering
3
WIlle
SNOW
Human resources
Snowflake
SELECT
*
FROM
employees
WHERE
RTRIM(last_name) LIKE RTRIM('SNO%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/);2
John
SNOW
Engineering
3
WIlle
SNOW
Human resources
IN Operation
Case 1: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE first_name IN ('George ');1
George
Snow
Sales
Snowflake
SELECT
*
FROM
employees
WHERE
RTRIM(first_name) IN (COLLATE('George ', 'en-cs-rtrim'));1
George
Snow
Sales
Case 2: Column constraint is CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT *
FROM employees
WHERE department IN ('EngineerinG ');4
Marco
SnoW
EngineerinG
Snowflake
SELECT
*
FROM
employees
WHERE
RTRIM(department) IN (RTRIM('EngineerinG '));4
Marco
SnoW
EngineerinG
ORDER BY clause
Case 1: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT first_name
FROM employees
ORDER BY first_name;GeorgE
GEORGE
GEORGE
George
John
JOHN
JOHN
Marco
Mary
WIlle
Snowflake
Please review FDM. Pending to add.
SELECT
first_name
FROM
employees
ORDER BY first_name;GeorgE
George
GEORGE
GEORGE
John
JOHN
JOHN
Marco
Mary
WIlle
Case 2: Column constraint is CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT last_name
FROM employees
ORDER BY last_name;EngineerinG
Engineering
Finance
Human resources
IT
SalEs
SaleS
Sales
salEs
sales
Snowflake
SELECT
last_name
FROM
employees
ORDER BY last_name;EngineerinG
Engineering
Finance
Human resources
IT
SalEs
SaleS
Sales
salEs
sales
GROUP BY clause
Case 1: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT first_name
FROM employees
GROUP BY first_name;Mary
GeorgE
WIlle
JOHN
Marco
GEORGE
Snowflake
The case or order may differ in output.
SELECT
first_name
FROM
employees
GROUP BY first_name;John
Marco
George
GeorgE
WIlle
Mary
Case 2: Column constraint is CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT last_name
FROM employees
GROUP BY last_name;SnoW
SNOW
SnoW
Snow
snow
Snowflake
SELECT
last_name
FROM
employees
GROUP BY last_name;Snow
SNOW
SnoW
SnoW
snow
HAVING clause
The HAVING clause will use the patterns in:
Evaluation operations.
For example:
=, !=, <, >.
LIKE operation.
IN Operation.
CAST to evaluation operation.
CAST to LIKE operation.
The following sample showcases a pattern with evaluation operation.
Sample: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT first_name
FROM employees
GROUP BY first_name
HAVING first_name = 'Mary';MarySnowflake
SELECT
first_name
FROM
employees
GROUP BY first_name
HAVING
COLLATE(first_name, 'en-cs-rtrim') = 'Mary';MaryCASE WHEN statement
The CASE WHEN statement will use the patterns described in:
Evaluation operations.
For example:
=, !=, <, >.
LIKE operation.
IN Operation.
CAST to evaluation operation.
CAST to LIKE operation.
The following sample showcases a pattern with evaluation operation.
Teradata
SELECT first_name,
last_name,
CASE
WHEN department = 'EngineerinG' THEN 'Information Technology'
WHEN first_name = ' GeorgE ' THEN 'GLOBAL SALES'
ELSE 'Other'
END AS department_full_name
FROM employees
WHERE last_name = '';GEORGE
Other
Mary
Other
GeorgE
GLOBAL SALES
GEORGE
Other
Snowflake
SELECT
first_name,
last_name,
CASE
WHEN RTRIM(department) = RTRIM('EngineerinG')
THEN 'Information Technology'
WHEN COLLATE(first_name, 'en-cs-rtrim') = ' GeorgE '
THEN 'GLOBAL SALES'
ELSE 'Other'
END AS department_full_name
FROM
employees
WHERE RTRIM(last_name) = RTRIM('');Mary
Other
GEORGE
Other
GEORGE
Other
GeorgE
GLOBAL SALES
JOIN clause
Simple scenarios with evaluation operations are supported.
The JOIN statement will use the patterns described in:
Evaluation operations.
For example:
=, !=, <, >.
LIKE operation.
IN Operation.
CAST to evaluation operation.
CAST to LIKE operation.
The following sample showcases a pattern with evaluation operation.
Sample: Column constraint is NOT CASESPECIFIC and database mode is ANSI Mode
Teradata
SELECT
e.employee_id,
e.first_name,
e.last_name,
d.department_name
FROM
employees e
JOIN
departments d
ON
e.department = d.department_name;1
George
Snow
Sales
10
JOHN
snow
Finance
Snowflake
SELECT
e.employee_id,
e.first_name,
e.last_name,
d.department_name
FROM
employees e
JOIN
departments d
ON COLLATE(e.department, 'en-cs-rtrim') = d.department_name;1
George
Snow
Sales
10
JOHN
snow
Finance
Related EWIs
SSC-EWI-TD0007: GROUP BY IS NOT EQUIVALENT IN TERADATA MODE
SC-FDM-TD0032 : [NOT] CASESPECIFIC CLAUSE WAS REMOVED
Last updated
