SnowConvert AI - Teradata - Teradataのセッションモード

Teradataセッションモードの説明

Teradataデータベースには、クエリを実行するためのさまざまなモードがあります: ANSI モード(ANSI SQL:2011仕様に基づくルール)と TERA モード(Teradataが定義したルール)。詳細情報については、以下の Teradataドキュメント を参照してください。

文字列情報テーブルのTeradataモード

文字列の場合、Teradataモードは異なる動作をします。Teradataのドキュメント に基づき、以下のテーブルで説明されています。

機能

ANSI モード

Teradataモード

文字比較のデフォルト属性

CASESPECIFIC

NOT に CASESPECIFIC

デフォルトの TRIM 動作

TRIM(BOTH FROM)

TRIM(BOTH FROM)

翻訳仕様概要

ModeColumn constraint valuesTeradata behaviorSC expected behavior
ANSI ModeCASESPECIFICCASESPECIFICNo constraint added.
NOT CASESPECIFICCASESPECIFICAdd COLLATE 'en-cs' in column definition.
Teradata ModeCASESPECIFICCASESPECIFICIn most cases, do not add COLLATE, and convert its usages of string comparison to RTRIM( expression )
NOT CASESPECIFICNOT CASESPECIFICIn most cases, do not add COLLATE, and convert its usages of string comparison to RTRIM(UPPER( expression ))

利用可能な翻訳仕様オプション

文字列比較の ANSI モード - COLLATE

このセクションでは、COLLATE を使用した ANSI モードでの文字列の翻訳仕様を定義します。

説明

文字列比較と COLLATE 使用の ANSI モード

ANSI モードの文字列比較は、必要に応じて、COLLATE 制約を列またはステートメントに適用します。デフォルトのケース仕様トリム動作が考慮される場合があります。

Teradataでは、デフォルトのケース仕様は'CASESPECIFIC'であり、Snowflakeの'case-sensitive' と同じデフォルトであることに注意してください。 したがって、これらのケースは冗長になるため、COLLATE を使用して翻訳されることはありません。

サンプルソースパターン

セットアップデータ

Teradata
 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');
Copy
Snowflake
 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');
Copy

比較操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name = 'GEorge ';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT
    *
FROM
    employees
WHERE
    COLLATE(first_name, 'en-cs-rtrim') = RTRIM('George');
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name = 'SNOW ';
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

Snowflake
クエリ
SELECT
 *
FROM
 employees
WHERE
 RTRIM(last_name) = RTRIM('SNOW ');
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

ケース3: CAST NOT CASESPECIFIC 列を CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT * FROM employees WHERE first_name = 'George   ' (CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake

注釈

COLLATE 'en-cs'は機能的等価性のために必要です。

クエリ
 SELECT
    *
FROM
    employees
WHERE
    COLLATE(first_name, 'en-cs-rtrim') = 'George   ' /*** SSC-FDM-TD0032 - CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース4: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT * FROM employees WHERE first_name = 'GEorge   ' (NOT CASESPECIFIC) ;
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

7

GEORGE

salEs

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(first_name) = RTRIM('GEorge   ' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/);
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

7

GEORGE

salEs

ケース5: CAST NOT CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT * FROM employees WHERE first_name (NOT CASESPECIFIC)  = 'George    ';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake

注釈

それには COLLATE が必要です。

クエリ
 SELECT
   * 
FROM
   employees
WHERE
   COLLATE(first_name /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/, 'en-cs-rtrim') = 'George    ';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

LIKE 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'George';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT *
FROM employees
WHERE COLLATE(first_name, 'en-cs-rtrim') LIKE 'George';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'Snow';
Copy
出力

employee_id

first_name

last_name

department

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

Snowflake
クエリ
 SELECT *
FROM employees
WHERE RTRIM(last_name) LIKE RTRIM('Snow');
Copy
出力

employee_id

first_name

last_name

department

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

ケース3: CAST NOT CASESPECIFIC 列を CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'Mary' (CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

5

Mary

SaleS

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   COLLATE(first_name, 'en-cs-rtrim') LIKE 'Mary' /*** SSC-FDM-TD0032 - CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

5

Mary

SaleS

ケース4: CAST CASESPECIFC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'SNO%' (NOT CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(last_name) LIKE RTRIM('SNO%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/);
Copy
出力

employee_id

first_name

last_name

department

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

IN 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name IN ('George   ');
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake

注釈

このケースには COLLATE(_ column_name_ , 'en-cs-rtrim') が必要です

クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(first_name) IN (COLLATE('George   ', 'en-cs-rtrim'));
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata

注釈

このケースの場合、列には列制約がありませんが、Teradata ANSI モードのデフォルト制約は CASESPECIFIC です。

クエリ
 SELECT *
FROM employees
WHERE department IN ('EngineerinG    ');
Copy
出力

employee_id

first_name

last_name

department

4

Marco

SnoW

EngineerinG

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(department) IN (RTRIM('EngineerinG    '));
Copy
出力

employee_id

first_name

last_name

department

4

Marco

SnoW

EngineerinG

ORDER BY 句

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT first_name
FROM employees
ORDER BY first_name;
Copy
出力

first_name

GeorgE

GEORGE

GEORGE

George

John

JOHN

JOHN

Marco

Mary

WIlle

Snowflake

警告

FDM をご確認ください。_ 追加を保留中です。 _

クエリ
 SELECT
   first_name
FROM
   employees
ORDER BY first_name;
Copy
出力

first_name

GeorgE

George

GEORGE

GEORGE

John

JOHN

JOHN

Marco

Mary

WIlle

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT last_name
FROM employees
ORDER BY last_name;
Copy
出力

department

EngineerinG

エンジニアリング

ファイナンス

Human resources

IT

SalEs

SaleS

販売

salEs

sales

Snowflake
クエリ
 SELECT
   last_name
FROM
   employees
ORDER BY last_name;
Copy
出力

department

EngineerinG

エンジニアリング

ファイナンス

Human resources

IT

SalEs

SaleS

販売

salEs

sales

GROUP BY 句

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT first_name
FROM employees
GROUP BY first_name;
Copy
出力

first_name

Mary

GeorgE

WIlle

JOHN

Marco

GEORGE

Snowflake

警告

ケースや順序により出力が異なる場合があります。

注釈

RTRIM は選択された列で必要です。

クエリ
   SELECT
   first_name
  FROM
   employees
  GROUP BY first_name;
Copy
出力

first_name

John

Marco

George

GeorgE

WIlle

Mary

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT last_name
FROM employees
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

Snowflake

注釈

順序が異なる場合があります。

クエリ
 SELECT
   last_name
  FROM
   employees
  GROUP BY last_name;
Copy
出力

first_name

Snow

SNOW

SnoW

SnoW

snow

HAVING 句

HAVING 句は、以下のパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT first_name
FROM employees
GROUP BY first_name
HAVING first_name = 'Mary';
Copy
出力
Mary

Copy
Snowflake
クエリ
 SELECT
  first_name
FROM
  employees
GROUP BY first_name
HAVING
   COLLATE(first_name, 'en-cs-rtrim') = 'Mary';
Copy
出力
Mary

Copy

CASE WHEN ステートメント

CASE WHEN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

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 = '';
Copy
出力

first_name

last_name

department_full_name

GEORGE

その他

Mary

その他

GeorgE

GLOBAL に SALES

GEORGE

その他

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('');
Copy
出力

first_name

last_name

department_full_name

Mary

その他

GEORGE

その他

GEORGE

その他

GeorgE

GLOBAL に SALES

JOIN 句

警告

評価操作による単純なシナリオをサポートします。

JOIN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
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;
Copy
出力

employee_id

first_name

last_name

department_name

1

George

Snow

販売

10

JOHN

snow

ファイナンス

Snowflake

注釈

d.department_nameNOT CASESPECIFIC ですので、COLLATE が必要です。

クエリ
    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;
Copy
出力

employee_id

first_name

last_name

department_name

1

George

Snow

販売

10

JOHN

snow

ファイナンス

文字列比較の ANSI モード - NO COLLATE

このセクションでは、COLLATE を使用しない ANSI モードでの文字列の翻訳仕様を定義します。

説明

文字列比較と NO COLATE 使用の ANSI モード

COLLATE を使用しない ANSI モードの文字列比較では、必要に応じて RTRIM と UPPER が適用されます。デフォルトのケース仕様トリム動作が考慮されるため、Teradata ANSI モードで列がケース仕様を持っていない場合、Teradataはデフォルトとして CASESPECIFIC を持ちます。

サンプルソースパターン

セットアップデータ

Teradata
 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');
Copy
Snowflake
 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": "10/30/2024",  "domain": "test" }}'
;

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": "10/30/2024",  "domain": "test" }}'
;

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');
Copy

比較操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name = 'George      ';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT
 *
FROM
employees
WHERE
RTRIM(first_name) = RTRIM('George      ');
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name = 'SNOW ';
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

Snowflake
クエリ
 SELECT
 *
FROM
employees
WHERE
 RTRIM(last_name) = RTRIM('SNOW ');
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

ケース3: CAST NOT CASESPECIFIC 列を CASESPECIFIC にし、データベースモードが ANSI モード

警告

CASESPECIFIC)はテーブル定義の列制約を上書きします。

Teradata
クエリ
 SELECT * FROM employees WHERE first_name = 'GEorge   ' (CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

6

GEORGE

sales

Snowflake
クエリ
 SELECT * FROM workers
WHERE RTRIM(first_name) = RTRIM(UPPER('GEorge   '));
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

6

GEORGE

sales

ケース4: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT * FROM employees
WHERE last_name = 'SnoW   ' (NOT CASESPECIFIC) ;
Copy
出力

employee_id

first_name

last_name

department

4

Marco

SnoW

EngineerinG

Snowflake
クエリ
 SELECT * FROM employees
WHERE RTRIM(last_name) = RTRIM('SnoW   ');
Copy
出力

employee_id

first_name

last_name

department

4

Marco

SnoW

EngineerinG

LIKE 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'Georg%';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'Georg%';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'Snow';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'Snow';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース3: CAST NOT CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'George' (NOT CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   first_name ILIKE 'George' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

ケース4: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'SNO%' (NOT CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   last_name LIKE 'SNO%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

IN 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name IN ('GEORGE   ');
Copy
出力

employee_id

first_name

last_name

department

6

GEORGE

sales

7

GEORGE

salEs

Snowflake
クエリ
 SELECT *
FROM employees
WHERE RTRIM(first_name) IN (RTRIM('GEORGE   '));
Copy
出力

employee_id

first_name

last_name

department

6

GEORGE

sales

7

GEORGE

salEs

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE department IN ('SaleS');
Copy
出力

employee_id

first_name

last_name

department

5

Mary

SaleS

Snowflake
クエリ
 SELECT *
FROM employees
WHERE RTRIM(department) IN (RTRIM('SaleS'));
Copy
出力

employee_id

first_name

last_name

department

5

Mary

SaleS

ORDER BY 句

注釈

この機能的等価性は異なる可能性があることに注意してください。

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT department_name
FROM departments
ORDER BY department_name;
Copy
出力

department

EngineerinG

エンジニアリング

ファイナンス

Human resources

IT

SalEs

SaleS

販売

salEs

sales

Snowflake

注釈

FDM をご確認ください。データの挿入順序により順序が異なります。

クエリ
 SELECT
   department_name
FROM
   departments
ORDER BY
   UPPER(department_name);
Copy
出力

department

EngineerinG

エンジニアリング

ファイナンス

Human resources

IT

SalEs

SaleS

販売

salEs

sales

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT last_name
FROM employees
ORDER BY last_name;
Copy
出力

department

ファイナンス

人事

Information Technology

販売

Snowflake
クエリ
 SELECT last_name
FROM employees
ORDER BY last_name;
Copy
出力

department

ファイナンス

人事

Information Technology

販売

GROUP BY 句

警告

機能的等価性を保証するためには、 COLLATE 式を使用する必要があります。

詳しくは SSC-EWI-TD0007 をご確認ください。

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT first_name
FROM employees
GROUP BY first_name;
Copy
出力

first_name

Mary

GeorgE

WIlle

John

Marco

GEORGE

Snowflake
クエリ
 SELECT
   first_name
FROM
   employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY first_name;
Copy
出力

FIRST_NAME

George

John

WIlle

Marco

Mary

GEORGE

GEORGE

GeorgE

JOHN

JOHN

ケース2: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT last_name
FROM employees
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

Snowflake
クエリ
 SELECT
   last_name
FROM
   employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

HAVING 句

HAVING 句は、以下のパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が NOT CASESPECIFIC で、データベースモードが ANSI モード
Teradata
クエリ
 SELECT first_name
FROM employees
GROUP BY first_name
HAVING first_name = 'GEORGE';
Copy
出力
GEORGE   

Copy
Snowflake
クエリ
 SELECT
   first_name
FROM
   employees
GROUP BY first_name
HAVING
   RTRIM(first_name) = RTRIM('GEORGE');
Copy
出力
GEORGE

Copy

CASE WHEN ステートメント

CASE WHEN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

Teradata
クエリ
 SELECT first_name,
      last_name,
      CASE
          WHEN department = 'SaleS  ' THEN 'GLOBAL SALES'
          WHEN first_name = 'GEORGE   ' THEN 'Department Full Name'
          ELSE 'Other'
      END AS department_full_name
FROM employees
WHERE last_name = '   ';
Copy
出力
first_namelast_namedepartment_full_name
GEORGEDepartment Full Name
MaryGLOBAL SALES
GeorgE Other
GEORGEDepartment Full Name
Snowflake
クエリ
 SELECT
      first_name,
      last_name,
      CASE
            WHEN UPPER(RTRIM(department)) = UPPER(RTRIM('SaleS  '))
                  THEN 'GLOBAL SALES'
            WHEN UPPER(RTRIM(first_name)) = UPPER(RTRIM('GEORGE   '))
                  THEN 'Department Full Name'
          ELSE 'Other'
      END AS department_full_name
FROM
      employees
WHERE
      UPPER(RTRIM( last_name)) = UPPER(RTRIM('   '));
Copy
出力
first_namelast_namedepartment_full_name
GEORGEDepartment Full Name
MaryGLOBAL SALES
GeorgE Other
GEORGEDepartment Full Name

JOIN 句

警告

単純なシナリオがサポートされています。

JOIN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が CASESPECIFIC で、データベースモードが ANSI モード
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;
Copy
出力

employee_id

first_name

last_name

department_name

1

George

Snow

販売

10

JOHN

snow

ファイナンス

Snowflake
クエリ
 SELECT
   e.employee_id,
   e.first_name,
   e.last_name,
   d.department_name
FROM
   employees e
JOIN
      departments d
ON RTRIM(e.department) = RTRIM(d.department_name);
Copy
出力

employee_id

first_name

last_name

department_name

1

George

Snow

販売

10

JOHN

snow

ファイナンス

関連 EWIs

SSC-EWI-TD0007: GROUP BY IS NOT EQUIVALENT IN TERADATA MODE

文字列比較の TERA モード - COLLATE

このセクションでは、COLLATE を使用したTeraモードでの文字列の翻訳仕様を定義します。

説明

文字列比較と COLLATE 使用のTeraモード

Teraモードの文字列比較は、必要に応じて、 COLLATE 制約を列またはステートメントに適用します。デフォルトのケース仕様トリム動作が考慮される場合があります。Teradataの TERA モードのデフォルトの大文字と小文字の指定は NOT CASESPECIFIC です。したがって、大文字と小文字の指定がない列は、 COLLATE('en-ci') の制約を持つことになります。

サンプルソースパターン

セットアップデータ

Teradata
 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');
Copy
Snowflake
 CREATE OR REPLACE TABLE employees (
    employee_id INTEGER NOT NULL,
    first_name VARCHAR(50) COLLATE 'en-ci',
    last_name VARCHAR(50),
    department VARCHAR(50) COLLATE 'en-ci'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "11/01/2024",  "domain": "test" }}'
;

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) COLLATE 'en-ci',
    location VARCHAR(100),
       PRIMARY KEY (department_id)
   )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "11/01/2024",  "domain": "test" }}'
;

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');
Copy

比較操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name = 'GEorge ';
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
 *
FROM
 employees
WHERE
 RTRIM(first_name) = RTRIM('GEorge ');
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name = 'SNOW ';
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

Snowflake
クエリ
SELECT
 *
FROM
 employees
WHERE
 RTRIM(last_name) = RTRIM('SNOW ');
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

ケース3: CAST NOT CASESPECIFIC 列を CASESPECIFIC にし、データベースモードが TERA モード

注釈

以下のクエリに注目してください

  • SELECT * FROM employees WHERE first_name = 'JOHN ' (CASESPECIFIC)

  • SELECT * FROM employees WHERE first_name (CASESPECIFIC) = 'JOHN '

は同じ値を返します。

Teradata
クエリ
 SELECT * FROM employees WHERE first_name = 'JOHN   ' (CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

9

JOHN

SnoW

IT

10

JOHN

snow

ファイナンス

Snowflake
クエリ
 SELECT
    *
FROM
    employees
WHERE 
    COLLATE(first_name, 'en-cs-rtrim') = 'JOHN   ' /*** SSC-FDM-TD0032 - CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

9

JOHN

SnoW

IT

10

JOHN

snow

ファイナンス

ケース4: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが TERA モード

注釈

比較の左側の列への CAST が優先されます。

\ 例:

  • SELECT * FROM employees WHERE last_name (NOT CASESPECIFIC) = 'snoW'; _では、 5行が返されます。 _

  • SELECT * FROM employees WHERE last_name = 'snoW' (NOT CASESPECIFIC); では、このセットアップデータで 0行 が返されます。

Teradata
クエリ
 SELECT * FROM employees WHERE last_name (NOT CASESPECIFIC)  = 'snoW' ;
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

4

Marco

SnoW

EngineerinG

10

JOHN

snow

ファイナンス

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   COLLATE(last_name /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/, 'en-ci-rtrim') = 'snoW' ;
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

2

John

SNOW

エンジニアリング

3

WIlle

SNOW

Human resources

4

Marco

SnoW

EngineerinG

10

JOHN

snow

ファイナンス

LIKE 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'GeorgE';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(first_name) LIKE RTRIM('GeorgE');
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'Snow';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(last_name) LIKE RTRIM('Snow');
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース3: CAST NOT CASESPECIFIC 列を CASESPECIFIC にし、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'George' (CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

Snowflake
クエリ
 SELECT
    *
FROM
    employees
WHERE
    COLLATE(first_name, 'en-cs-rtrim') LIKE 'George';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

ケース4: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'SNO%' (NOT CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(last_name) LIKE RTRIM('SNO%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/);
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

IN 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name IN ('George   ');
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(first_name) IN (RTRIM('George   '));
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

ケース2: 列制約が定義されておらず、データベースモードが TERA モード

注釈

Teraモードでは、大文字と小文字の指定が定義されていない場合、 NOT CASESPECIFIC を意味します。

Teradata
クエリ
 SELECT *
FROM employees
WHERE department IN ('Sales    ');
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

5

Mary

SaleS

6

GEORGE

sales

7

GEORGE

salEs

8

GeorgE

SalEs

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(department) IN (RTRIM('Sales    '));
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

5

Mary

SaleS

6

GEORGE

sales

7

GEORGE

salEs

8

GeorgE

SalEs

ケース3: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name IN ('SNOW   ');
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(last_name) IN (RTRIM('SNOW   '));
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

ORDER BY 句

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT employee_id, first_name
FROM employees
ORDER BY employee_id, first_name;
Copy
出力
employee_idfirst_name
1George
2John
3WIlle
4Marco
5Mary
6GEORGE
7GEORGE
8 GeorgE
9JOHN
10JOHN
Snowflake
クエリ
 SELECT employee_id, first_name
FROM employees
ORDER BY employee_id, first_name;
Copy
出力
employee_idfirst_name
1George
2John
3WIlle
4Marco
5Mary
6GEORGE
7GEORGE
8 GeorgE
9JOHN
10JOHN
ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT employee_id, last_name
FROM employees
ORDER BY employee_id, last_name;
Copy
出力
employee_idlast_name
1Snow
2SNOW
3SNOW
4SnoW
5
6
7
8
9SnoW
10snow
Snowflake
クエリ
 SELECT employee_id, last_name
FROM employees
ORDER BY employee_id, last_name;
Copy
出力
employee_idlast_name
1Snow
2SNOW
3SNOW
4SnoW
5
6
7
8
9SnoW
10snow

GROUP BY 句

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT first_name
FROM employees
GROUP BY first_name;
Copy
出力

first_name

Mary

GeorgE

WIlle

JOHN

Marco

GEORGE

Snowflake

警告

出力の大文字と小文字の指定は、選択した列数によって異なる場合があります。

クエリ
 SELECT
   first_name
FROM
   employees
GROUP BY first_name;
Copy
出力

first_name

John

Marco

George

GeorgE

WIlle

Mary

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT last_name
FROM employees
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

Snowflake
クエリ
 SELECT
   last_name
FROM
   employees
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

HAVING 句

HAVING 句は、以下のパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata

注釈

出力の大文字と小文字の指定は、選択した列数によって異なる場合があります。これは GROUP BY 句にも関連しています。

クエリ
 SELECT first_name
FROM employees
GROUP BY first_name
HAVING first_name = 'George  ';
Copy
出力
employee_idfirst_name
7GEORGE
1George
6GEORGE
Snowflake
クエリ
 SELECT
  employee_id,
  first_name
FROM
  employees
GROUP BY employee_id, first_name
HAVING
   RTRIM(first_name) = RTRIM('George  ');
Copy
出力
employee_idfirst_name
7GEORGE
1George
6GEORGE

CASE WHEN ステートメント

CASE WHEN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

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 = '';
Copy
出力

first_name

last_name

department_full_name

GEORGE

GLOBAL に SALES

Mary

その他

GeorgE

その他

GEORGE

GLOBAL に SALES

Snowflake
クエリ
 SELECT
   first_name,
   last_name,
   CASE
      WHEN RTRIM(department) = RTRIM('Engineering')
         THEN 'Information Technology'
      WHEN RTRIM(first_name) = RTRIM('GeorgE')
         THEN 'GLOBAL SALES'
      ELSE 'Other'
   END AS department_full_name
FROM
   employees
WHERE
   RTRIM( last_name) = RTRIM('');
Copy
出力

first_name

last_name

department_full_name

GEORGE

GLOBAL に SALES

Mary

その他

GeorgE

その他

GEORGE

GLOBAL に SALES

JOIN 句

警告

評価操作による単純なシナリオをサポートします。

JOIN ステートメントでは、以下で説明するパターンを使用します。

  • EvaluaComparisonComparisontion 操作 。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
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;
Copy
出力

employee_id

first_name

last_name

department_name

1

George

Snow

販売

3

WIlle

SNOW

人事

5

Mary

販売

6

GEORGE

販売

7

GEORGE

販売

8

GeorgE

販売

10

JOHN

snow

ファイナンス

Snowflake
クエリ
 SELECT
   e.employee_id,
   e.first_name,
   e.last_name,
   d.department_name
FROM
   employees e
JOIN
   departments d
ON RTRIM(e.department) = RTRIM(d.department_name);
Copy
出力

employee_id

first_name

last_name

department_name

1

George

Snow

販売

3

WIlle

SNOW

人事

5

Mary

販売

6

GEORGE

販売

7

GEORGE

販売

8

GeorgE

販売

10

JOHN

snow

ファイナンス

関連 EWIs

SSC-EWI-TD0007: GROUP BY REQUIRED COLLATE FOR CASE INSENSITIVE COLUMNS

SC-FDM-TD0032 : [NOT] CASESPECIFIC CLAUSE WAS REMOVED

文字列比較の TERA モード - NO COLLATE

このセクションでは、COLLATE を使用しないTeraモードでの文字列の翻訳仕様を定義します。

説明

文字列比較と NO COLLATE 使用のTeraモード

COLLATE を使用しないTeraモードの文字列比較では、必要に応じて RTRIMUPPER が適用されます。デフォルトのケース仕様トリム動作が考慮される場合があります。

サンプルソースパターン

セットアップデータ

Teradata
 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');
Copy
Snowflake
 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": "10/30/2024",  "domain": "test" }}'
;

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": "10/30/2024",  "domain": "test" }}'
;

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');
Copy

比較操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード

この例では、 first_name 列であるため、 NOT CASESPECIFIC としてセットアップされた列の使用を示します。文字列 「GEorge」 を要求する場合でも、クエリの実行では大文字と小文字の指定が考慮されないため、Teradataで結果が取得されます。

Snowflakeでこのシナリオをエミュレートするために、2つの関数が実装されています。文字列では大文字と小文字の指定が確認されないため、このシナリオでは RTRIM(UPPER(string_evaluation))UPPER が必要です。

Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name = 'GEorge ';
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
 *
FROM
 employees
WHERE
 RTRIM(UPPER(first_name)) = RTRIM(UPPER('GEorge '));
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード

この例では、列制約は CASESPECIFIC です。「Snow」が「SNOW」と等しくないため、この例ではTeradataの行を取得しません。

Snowflakeでは、大文字と小文字の指定が重要であるため、結果の移行は RTRIM 関数の使用のみを指します。

Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name = 'SNOW ';
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

Snowflake
クエリ
SELECT
 *
FROM
 employees
WHERE
 RTRIM(last_name) = RTRIM('SNOW ');
Copy
出力

employee_id

first_name

last_name

department

3

WIlle

SNOW

Human resources

2

John

SNOW

エンジニアリング

ケース3: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが TERA モード
Teradata

警告

CASESPECIFIC)はテーブル定義の列制約を上書きします。

クエリ
 SELECT * FROM employees WHERE first_name = 'GEORGE   ' (CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

6

GEORGE

sales

Snowflake

注釈

左側には RTRIM が必須で、右側には RTRIM が必須です。

クエリ
 SELECT
   * 
FROM
   employees
WHERE
   RTRIM(first_name) = RTRIM('GEORGE   ' /*** SSC-FDM-TD0032 - CASESPECIFIC CLAUSE WAS REMOVED ***/);
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

6

GEORGE

sales

ケース4: CAST NOT CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが TERA モード
Teradata
クエリ
 SELECT * FROM employees WHERE first_name = 'GEorge   ' (NOT CASESPECIFIC) ;
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   * 
FROM
   employees
WHERE
   UPPER(RTRIM(first_name)) = UPPER(RTRIM('GEorge   ' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/));
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

ケース5: 空白スペースのケース。列制約は NOT CASESPECIFIC、データベースモードは TERA モードで、等価演算を使用しています
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name = '   ';
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

5

Mary

SaleS

8

GeorgE

SalEs

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   RTRIM(last_name) = RTRIM('   ');
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

5

Mary

SaleS

8

GeorgE

SalEs

6

GEORGE

sales

LIKE 操作

注釈

この操作は別の操作とは異なります。情報を取得するためには、空白スペースは同じ量でなければなりません。

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード

この例では、大文字と小文字の指定は関係ないため、1行が表示されます。

注釈

Snowflakeでは、移行は ILIKE 操作を使用します。これは大文字と小文字を区別しない比較を実行します。

Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'GeorgE';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT *
FROM employees
WHERE first_name ILIKE 'GeorgE';
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'Snow';
Copy
出力

first_name

last_name

department

George

Snow

販売

Jonh

Snow

エンジニアリング

Snowflake
クエリ
 SELECT *
FROM employees
WHERE last_name LIKE 'Snow';
Copy
出力

first_name

last_name

department

George

Snow

販売

Jonh

Snow

エンジニアリング

ケース3: CAST CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'George' (NOT CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE 
   first_name ILIKE 'George' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

1

George

Snow

販売

6

GEORGE

sales

ケース4: CAST NOT CASESPECIFIC 列を NOT CASESPECIFIC にし、データベースモードが ANSI モード

注釈

このケースは ILIKE に翻訳する必要があります。

Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name LIKE 'GE%' (NOT CASESPECIFIC);
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT
   *
FROM
   employees
WHERE
   first_name ILIKE 'GE%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

IN 操作

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT *
FROM employees
WHERE first_name IN ('GeorgE');
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

Snowflake
クエリ
 SELECT *
FROM employees
WHERE RTRIM(UPPER(first_name)) IN (RTRIM(UPPER('GeorgE')));
Copy
出力

employee_id

first_name

last_name

department

7

GEORGE

salEs

1

George

Snow

販売

6

GEORGE

sales

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード

この例では、Teradataデータベースでは大文字と小文字の指定が結果に関係するため、 UPPER 関数の使用は必要ありません。

Teradata
クエリ
 SELECT *
FROM employees
WHERE last_name IN ('SnoW');
Copy
出力

employee_id

first_name

last_name

department

4

Marco

SnoW

EngineerinG

Snowflake
クエリ
 SELECT *
FROM employees
WHERE RTRIM(last_name) IN (RTRIM('SnoW'));
Copy
出力

employee_id

first_name

last_name

department

4

Marco

SnoW

EngineerinG

ORDER BY 句

ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード

危険

この出力順序は異なる可能性があることに注意してください。

Teradata
クエリ
 SELECT department
FROM employees
ORDER BY department;
Copy
出力

department

EngineerinG

エンジニアリング

ファイナンス

Human resources

IT

sales

SalEs

販売

SaleS

salEs

Snowflake
クエリ
 SELECT department
FROM employees
ORDER BY UPPER(department);
Copy
出力

department

EngineerinG

エンジニアリング

ファイナンス

Human resources

IT

sales

SalEs

販売

SaleS

salEs

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード

危険

この出力は順序が異なる可能性があることに注意してください。

Teradata
クエリ
 SELECT last_name
FROM employees
ORDER BY last_name;
Copy
出力

last_name

SnoW

SNOW

SNOW

SnoW

Snow

snow

Snowflake
クエリ
 SELECT last_name
FROM employees
ORDER BY last_name;
Copy
出力

last_name

SnoW

SNOW

SNOW

SnoW

Snow

snow

GROUP BY 句

警告

この出力は異なる可能性があることに注意してください。 機能的等価性を保証するためには、 COLLATE 式を使用する必要があります。

詳細は SSC-EWI-TD0007 をご覧ください。

以下は、 collate を使用しない回避策です。

SELECT RTRIM(UPPER(first_name))

FROM employees

GROUP BY RTRIM(UPPER(first_name));

列動作について

危険

Snowflakeのデータ挿入についてご確認ください。Snowflakeでは、大文字と小文字の指定が列と明示的に結合されていないため、エラーを表示することなく'GEORGE'や'georges'のような値を挿入することができます。

以下のようなテーブルとデータがあるとします。

 CREATE TABLE students (
   first_name VARCHAR(50) NOT CASESPECIFIC
);

INSERT INTO students(first_name) VALUES ('George');
INSERT INTO students(first_name) VALUES ('   George');
Copy

このサンプルでは、 NOT CASESPECIFIC 列に大文字と小文字の値を挿入することができないことに注意してください。これは、同じ値とみなされるからです。列は大文字と小文字の指定を管理しないため、'GEORGE'と'george'の値は同じ情報としてチェックされます。

以下の行は 重複行エラー とみなされます。

 INSERT INTO students(first_name) VALUES ('GEORGE');
INSERT INTO students(first_name) VALUES ('GeorGe');
INSERT INTO students(first_name) VALUES ('George  ');
INSERT INTO students(first_name) VALUES ('GeOrge');
INSERT INTO students(first_name) VALUES ('GEorge');
INSERT INTO students(first_name) VALUES ('George');
Copy
ケース1: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT first_name
FROM employees
GROUP BY first_name;
Copy
出力

first_name

Mary

GeorgE

WIlle

JOHN

Marco

GEORGE

Snowflake
クエリ
 SELECT
   first_name
FROM
   employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY first_name;
Copy
出力

first_name

George

John

WIlle

Marco

Mary

GEORGE

GEORGE

GeorgE

JOHN

JOHN

ケース2: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT last_name
FROM employees
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

Snowflake
クエリ
 SELECT
   last_name
FROM
   employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY last_name;
Copy
出力

last_name

SnoW

SNOW

SnoW

Snow

snow

HAVING 句

HAVING 句は、以下のパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が CASESPECIFIC で、データベースモードが TERA モード
Teradata
クエリ
 SELECT last_name
FROM employees
GROUP BY last_name
HAVING last_name = 'Snow';
Copy
出力

last_name

Snow

Snowflake
クエリ
 SELECT last_name
FROM employees
GROUP BY last_name
HAVING RTRIM(last_name) = RTRIM('Snow');
Copy
出力

last_name

Snow

CASE WHEN ステートメント

CASE WHEN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

Teradata
クエリ
 SELECT first_name,
      last_name,
      CASE
          WHEN department = 'EngineerinG' THEN 'Information Technology'
          WHEN last_name = 'SNOW' THEN 'GLOBAL COOL SALES'
          ELSE 'Other'
      END AS department_full_name
FROM employees;
Copy
出力

first_name

last_name

department_full_name

GEORGE

その他

JOHN

SnoW

その他

Mary

その他

JOHN

snow

その他

WIlle

SNOW

GLOBAL COOL SALES

George

Snow

その他

GeorgE

その他

GEORGE

その他

Marco

SnoW

Information Technology

John

SNOW

Information Technology

Snowflake
クエリ
 SELECT
   first_name,
   last_name,
   CASE
      WHEN UPPER(RTRIM(department)) = UPPER(RTRIM('EngineerinG'))
         THEN 'Information Technology'
      WHEN RTRIM(last_name) = RTRIM('SNOW')
         THEN 'GLOBAL COOL SALES'
      ELSE 'Other'
   END AS department_full_name
FROM
   employees;
Copy
出力

first_name

last_name

department_full_name

GEORGE

その他

JOHN

SnoW

その他

Mary

その他

JOHN

snow

その他

WIlle

SNOW

GLOBAL COOL SALES

George

Snow

その他

GeorgE

その他

GEORGE

その他

Marco

SnoW

Information Technology

John

SNOW

Information Technology

JOIN 句

警告

単純なシナリオがサポートされています。

JOIN ステートメントでは、以下で説明するパターンを使用します。

  • 評価操作。

    • 例: =、!=、<、>。

  • LIKE 操作。

  • IN 操作。

  • 評価操作への CAST。

  • LIKE 操作への CAST。

次のサンプルは、評価操作のパターンを示しています。

サンプル: 列制約が NOT CASESPECIFIC で、データベースモードが TERA モード
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;
Copy
出力
employee_idfirst_namelast_namedepartment_name
1GeorgeSnowSales
3WIlleSNOWHuman Resources
5MarySales
6GEORGESales
7GEORGESales
8 GeorgE Sales
10JOHNsnowFinance
Snowflake
クエリ
 SELECT
   e.employee_id,
   e.first_name,
   e.last_name,
   d.department_name
FROM
   employees e
JOIN
   departments d
ON UPPER(RTRIM(e.department)) = UPPER(RTRIM(d.department_name));
Copy
出力
employee_idfirst_namelast_namedepartment_name
1GeorgeSnowSales
3WIlleSNOWHuman Resources
5MarySales
6GEORGESales
7GEORGESales
8 GeorgE Sales
10JOHNsnowFinance

既知の問題

  1. モード固有の SQL ステートメント制限があります: BEGIN TRANSACTIONEND TRANSACTIONCOMMIT [WORK]

  2. Snowflakeでは、大文字と小文字の指定が列宣言に束縛されないため、データ挿入が異なる場合があります。

  3. GROUP BY は順序が異なる場合がありますが、正しい値をグループ化します。

  4. ORDER BY はSnowflakeでは異なる動作をします。

  5. 関数がソースコードから TRIM()を持っている場合、この回避策はソースコードに必要な関数を追加します。そのため、 RTRIM は TRIM()ソース関数に適用されます。

関連 EWIs

SSC-EWI-TD0007: GROUP BY IS NOT EQUIVALENT IN TERADATA MODE