はじめに
セキュリティ上の観点からproductionでrails consoleを使えないことがあります。
このとき登録されているデータの調査を行う場合、redashなどをBI ToolからSQLで調査することがあると思います。
その際のenumを見やすく表示する方法をまとめます。
集計方法(やりかた)
次のような、roleがenumで定義されています。
enum role: { user: 1, admin: 9 }
こんな感じのデータを調査します。
name | role |
---|---|
test_1 | 1 |
test_2 | 1 |
admin_1 | 9 |
admin_2 | 9 |
調査用のSQLであるため、速度を気にせずサブクエリを使います。
SELECT td.name, td.role, enum_code.name
FROM test_data AS td
JOIN
(
SELECT 'user' AS name, 0 AS code UNION ALL
SELECT 'admin' AS name, 9 AS code
) AS enum_code
ON td.role = enum_code.code;
次のような結果になり、ロール名が表示されます。
name | role | role_name |
---|---|---|
test_1 | 0 | user |
test_2 | 0 | user |
admin_1 | 9 | admin |
admin_2 | 9 | admin |
余談
以下は余談ですが、追加で説明しておきたい情報です。
試した環境
結合するための一時的な表
※ 一時的な表
の公式な呼び方があれば、ご教示いただけると幸いです。
SELECT 'user' AS name, 0 AS code
を実行すると次のような 一時的な表
を作れます。
name | code |
---|---|
user | 0 |
これを複数行作って UNION ALL
で行単位で結合しています。
name | code |
---|---|
user | 0 |
admin | 9 |
そして、JOINで列単位で結合しています。
name | role | role_name |
---|---|---|
test_1 | 0 | user |
test_2 | 0 | user |
admin_1 | 9 | admin |
admin_2 | 9 | admin |
FROMの省略
MySQLとPostgreSQLでは FROM
を省略したSQL文が書けます。
Oracle と DB2 ではFROMの省略はできないので、 FROM dual
を使います。
SELECT 'user' AS name, 0 AS code FROM dual;
https://docs.oracle.com/cd/E16338_01/server.112/b56299/queries009.htm
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.porting.doc/doc/r0052874.html
with句
PostgreSQLはwith句が使えるので一時的な表を最初に記述できます。
この書き方は、上から順番に処理が追えるので集計用クエリを作る際に使っています。
MySQLの場合は8.0から使えるようです。
WITH enum_code AS (
SELECT 'user' AS name, 0 AS code UNION ALL
SELECT 'admin' AS name, 9 AS code
)
SELECT td.name, td.role, enum_code.name AS role_name
FROM test_data AS td
JOIN enum_code
ON td.role = enum_code.code;
https://www.postgresql.jp/document/12/html/queries-with.html
https://dev.mysql.com/doc/refman/8.0/en/with.html