Amazon Redshift: “SELECT文の結果列名の大文字/小文字表記”が指定が出来るようになりました

2017.10.13

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

小ネタです。

直近通知されたメンテナンス情報にて、「Uppercase column names(大文字カラム名)」なる対応がリリースされるという記載がありました。

当エントリではその内容について詳細を確認してみたいと思います。

SELECT文の結果で得られる列名の大文字/小文字指定が可能に

機能詳細に言及しているテキストは以下。

この内容によると「SELECT文によって返される列名を大文字にするか小文字にするか、選べるようになる」というもののようです。セッションベースのパラメータを変更・設定する事で、大文字と小文字を区別するアプリケーションがAmazon Redshiftを簡単に照会できるようになります。

*Uppercase column names. You can now specify whether column names returned by SELECT statements are uppercase or lowercase. With this feature, you can now set a session-based parameter to enable your case-sensitive applications to easily query Amazon Redshift. For more information, see describe_field_name_in_uppercase.

この機能は上記メンテナンス情報によるとビルド番号が1.0.1470以上となっていれば利用可能です。

$ aws redshift describe-clusters --cluster-identifier (クラスタ名) \
>  | jq '.Clusters[] | .ClusterVersion, .ClusterRevisionNumber'
"1.0"
"1485"

列名の大文字/小文字指定:実践

では実際にこの機能がどのような挙動を示すか、試してみます。「セッションベースのパラメータを...」とあるように、この値についてはクラスタに紐付くパラメータグループの設定項目には含まれていません。クラスタのビルド番号が条件を満たしている状態でパラメータグループを確認してみました(下記キャプチャ)が、該当項目は見当たりませんでした。

redshift-uppsercase-column-name_01

設定についてはdescribe_field_name_in_uppercaseという項目の値をON/OFFで切り替える事で行います。

# SHOW describe_field_name_in_uppercase;
 describe_field_name_in_uppercase 
----------------------------------
 off
(1 row)

# SET describe_field_name_in_uppercase to on;
SET
# SHOW describe_field_name_in_uppercase;
 DESCRIBE_FIELD_NAME_IN_UPPERCASE 
----------------------------------
 on
(1 row)

# SET describe_field_name_in_uppercase to off;
SET
# SHOW describe_field_name_in_uppercase;
 describe_field_name_in_uppercase 
----------------------------------
 off
(1 row)

これまでの状況、つまり設定値がoffの場合の挙動を確認してみます。結果はこれまで通り小文字のカラム名で返ってきています。

# SHOW describe_field_name_in_uppercase;
 describe_field_name_in_uppercase 
----------------------------------
 off
(1 row)

# \x
Expanded display is on.
# SELECT * FROM public.orders LIMIT 1;
-[ RECORD 1 ]--------+-----------------------------------------------------------------------------------------------------
row_id               | 6455
order_id             | 45959
order_date           | 2009-12-06
order_priority       | Medium         
order_quantity       | 35
sales                | 1822.13
discount             | 0
ship_mode            | Regular Air         
profit               | 155.17
unit_price           | 49.99
shipping_cost        | 19.99
customer_name        | Roy Collins                                                                                         
province             | Saskachewan                   
region               | Prarie                        
customer_segment     | Corporate                     
product_category     | Technology                              
product_sub_category | Computer Peripherals                              
product_name         | Zoom V.92 USB External Faxmodem
product_container    | Small Box                     
product_base_margin  | 0.41
ship_date            | 2009-12-08

設定値をonにして再度同じクエリを実行してみます。すると結果で返ってくる列名が全て大文字になっている事が確認出来ました。

# SET describe_field_name_in_uppercase TO on;
SET
# SHOW describe_field_name_in_uppercase;
 describe_field_name_in_uppercase 
----------------------------------
 off
(1 row)
# \x
Expanded display is on.
# SELECT * FROM public.orders LIMIT 1;
-[ RECORD 1 ]--------+-----------------------------------------------------------------------------------------------------
ROW_ID               | 6455
ORDER_ID             | 45959
ORDER_DATE           | 2009-12-06
ORDER_PRIORITY       | Medium         
ORDER_QUANTITY       | 35
SALES                | 1822.13
DISCOUNT             | 0
SHIP_MODE            | Regular Air         
PROFIT               | 155.17
UNIT_PRICE           | 49.99
SHIPPING_COST        | 19.99
CUSTOMER_NAME        | Roy Collins                                                                                         
PROVINCE             | Saskachewan                   
REGION               | Prarie                        
CUSTOMER_SEGMENT     | Corporate                     
PRODUCT_CATEGORY     | Technology                              
PRODUCT_SUB_CATEGORY | Computer Peripherals                              
PRODUCT_NAME         | Zoom V.92 USB External Faxmodem
PRODUCT_CONTAINER    | Small Box                     
PRODUCT_BASE_MARGIN  | 0.41
SHIP_DATE            | 2009-12-08

セッション毎の設定となるので、一度DB接続を切断してしまうと設定も無効となってしまいます。クラスタ単位で恒常的にこの値を有効(SELECT文で常に列名を大文字で返す)とする場合は以下の形でALTER USER文を用い、接続ユーザーでの設定を行う事で対応が可能となります。

# ALTER USER cmuser SET describe_field_name_in_uppercase = on;
ALTER USER
# SHOW describe_field_name_in_uppercase;
 describe_field_name_in_uppercase 
----------------------------------
 off
(1 row)

# \q
$
$ psql -h xxx.xxx.xxx.xxx -U cmuser -d xxxxdb -p 5439
Password for user root: 
psql (9.6.3, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: on)
Type "help" for help.

# SHOW describe_field_name_in_uppercase;
 DESCRIBE_FIELD_NAME_IN_UPPERCASE 
----------------------------------
 on
(1 row)

まとめ

という訳で、Amazon Redshiftの「SELECT文で返ってくる結果におけるテーブル列名の大文字・小文字指定」に関する内容のご紹介でした。アプリケーションやデータ移行等の絡みで列名の大文字・小文字を区別しないといけないような場合、パラメータ値の切り替え一つで対応出来るようになるのは嬉しいところですね。