この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
小ネタです。
直近通知されたメンテナンス情報にて、「Uppercase column names(大文字カラム名)」なる対応がリリースされるという記載がありました。
当エントリではその内容について詳細を確認してみたいと思います。
SELECT文の結果で得られる列名の大文字/小文字指定が可能に
機能詳細に言及しているテキストは以下。
この内容によると「SELECT文によって返される列名を大文字にするか小文字にするか、選べるようになる」というもののようです。セッションベースのパラメータを変更・設定する事で、大文字と小文字を区別するアプリケーションがAmazon Redshiftを簡単に照会できるようになります。
この機能は上記メンテナンス情報によるとビルド番号が1.0.1470以上となっていれば利用可能です。
$ aws redshift describe-clusters --cluster-identifier (クラスタ名) \
> | jq '.Clusters[] | .ClusterVersion, .ClusterRevisionNumber'
"1.0"
"1485"
列名の大文字/小文字指定:実践
では実際にこの機能がどのような挙動を示すか、試してみます。「セッションベースのパラメータを...」とあるように、この値についてはクラスタに紐付くパラメータグループの設定項目には含まれていません。クラスタのビルド番号が条件を満たしている状態でパラメータグループを確認してみました(下記キャプチャ)が、該当項目は見当たりませんでした。
設定については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文で返ってくる結果におけるテーブル列名の大文字・小文字指定」に関する内容のご紹介でした。アプリケーションやデータ移行等の絡みで列名の大文字・小文字を区別しないといけないような場合、パラメータ値の切り替え一つで対応出来るようになるのは嬉しいところですね。