[新機能] Amazon Redshift データベース、テーブル、列の名前など、識別子の大文字と小文字を区別をサポートしました

2021.04.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部コンサルティングチームの石川です。Amazon Redshift データベース、テーブル、カラムの名前など、識別子の大文字と小文字を区別するenable_case_sensitive_identifierをサポートしました。早速、試してみます。

enable_case_sensitive_identifierをサポートのメリット

この世の中には、データベース名やテーブル名やカラム名が大文字以外受け付けないツールがあります。この場合は、一律、describe_field_name_in_uppercaseONにできるのですが、大文字、小文字、大文字と小文字の混在できませんでした。

今回、サポートされたenable_case_sensitive_identifierを使えば、大文字、小文字、大文字と小文字の混在も対応できます。

大文字と小文字が混在したテーブル試してみる

下記の通り、大文字小文字混在、小文字のみ、大文字のみのカラム名が表示されています。テーブル名やカラム名にダブルクオートを付けるのを忘れないでください。

cmdb=# SET enable_case_sensitive_identifier TO true;
SET

cmdb=# CREATE TABLE "Venue"(
        "venueId" smallint not null distkey sortkey,
        "venuename" varchar(100),
        "VENUENAME" varchar(30)
);
CREATE TABLE

cmdb=# \d
        List of relations
 Schema | Name  | Type  |  Owner
--------+-------+-------+---------
 public | Venue | table | awsuser
(1 row)

cmdb=# \d "Venue"
                        Table "public.Venue"
  Column   |          Type          | Collation | Nullable | Default
-----------+------------------------+-----------+----------+---------
 venueId   | smallint               |           | not null |
 venuename | character varying(100) |           |          |
 VENUENAME | character varying(30)  |           |          |

引き続き、データの挿入と参照を試してみました。テーブル名やカラム名にダブルクオートを付けると問題ありません。

cmdb=# INSERT INTO "Venue"("venueId", "venuename", "VENUENAME")
VALUES(100, '日本武道館', 'nippon_budoukan');
INSERT 0 1

cmdb=# SELECT "venueId", "venuename", "VENUENAME" FROM "Venue";
 venueId | venuename  |    VENUENAME
---------+------------+-----------------
     100 | 日本武道館 | nippon_budoukan
(1 row)

cmdb=# SELECT * FROM "Venue";
 venueId | venuename  |    VENUENAME
---------+------------+-----------------
     100 | 日本武道館 | nippon_budoukan
(1 row)

もちろん、大文字と小文字を間違えるとエラーになります。

cmdb=# SELECT "venueid" FROM "Venue";
ERROR:  column "venueid" does not exist in Venue

ここで、enable_case_sensitive_identifierFALSEどうなるかというと、大文字・小文字が混在しているテーブル名を参照できなくなりました。

cmdb=# SET enable_case_sensitive_identifier TO FALSE;
SET

cmdb=# \d
        List of relations
 schema | name  | type  |  owner
--------+-------+-------+---------
 public | Venue | table | awsuser
(1 row)

cmdb=# SELECT * FROM "Venue";
ERROR:  relation "venue" does not exist

UNLOADで大文字と小文字の混在したカラム名が出力できる

個人的に嬉しいポイントは、UNLOAD カラム名が自由に設定できる点です。集計したデータを外部に共有する場合、どうしてもnoNoユーザーidではなくユーザーIDでなければならないということがあり、この場合ヘッダを別途付与するなんてことがありました。

下記のように、出力したいヘッダのエイリアスをつけて、UNLOADすると、

cmdb=# SET enable_case_sensitive_identifier TO true;
SET

cmdb=# UNLOAD
('
  SELECT
    catid AS "Category ID",
    catgroup AS "Category Group",
    catname AS "Category Name",
    catdesc AS "Category Description"
  FROM tickit.category
')
TO 's3://cm-bucket/category_unload/category_'
IAM_ROLE 'arn:aws:iam::123456789012:role/cm-redshift-fullaccess-role'
HEADER
PARALLEL OFF;
INFO:  UNLOAD completed, 11 record(s) unloaded successfully.
UNLOAD

ファイルのヘッダも大文字・小文字が混在して出力可能になります。

% aws s3 ls s3://cm-bucket/category_unload/ 
2021-04-28 19:45:02          0
2021-04-28 20:01:36        516 category_000

% aws s3 cp s3://cm-bucket/category_unload/category_000 - 
Category ID|Category Group|Category Name|Category Description
2|Sports|NHL|National Hockey League
4|Sports|NBA|National Basketball Association
5|Sports|MLS|Major League Soccer
7|Shows|Plays|All non-musical theatre
9|Concerts|Pop|All rock and pop music concerts
10|Concerts|Jazz|All jazz singers and bands
1|Sports|MLB|Major League Baseball
3|Sports|NFL|National Football League
6|Shows|Musicals|Musical theatre
8|Shows|Opera|All opera and light opera
11|Concerts|Classical|All symphony, concerto, and choir concerts

まとめ

個人的には、UNLOAD カラム名が自由に設定できることが理由で、このブログを書いています。Redshiftを中心にデータ統合する Lake House Arcitectureにおいて、分析・集計したサマリデータを配布するときにこの機能は役に立つのではないかと考えています。