0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RailsのenumをSQLから集計する

Posted at

はじめに

セキュリティ上の観点から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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?