VALUESまたはCASEを使用して結果をより読みやすくする

データエクスプローラーでクエリを作成していると、結果にテキストの代わりにコードが表示されることがあります。フィールドにはデータエクスプローラーツリーにキーがあることが多いですが、結果においては(すべて暗記していない限り)あまり役に立ちません。:slight_smile:

これらをより見やすく、他の人と共有しやすくするために、いくつかの方法があります。

まずはこちらから…

VALUES

最初のクエリは、特定のトピックに対してユーザーが受け取ったすべての通知を取得するように作成されましたが、notification_type コードだけを出力するのではなく、VALUES を使用して一時テーブルを作成し、それぞれをより人間が読める形式にマッピングしています。

-- ユーザーIDとトピックIDのパラメータを定義します
-- [params]
-- user_id :user_id
-- topic_id :topic_id

-- ntypes という名前の共通テーブル式 (CTE) を作成します
-- この CTE は通知タイプ名とその対応する ID をマッピングします
WITH ntypes(notification_type, notification_type_id) AS (
  VALUES
    -- 通知タイプとその対応する ID のペアを定義します
    ('mentioned', 1),
    ('replied',2),
    ('quoted',3),
    ('edited', 4),
    ('liked', 5),
    ('private_message', 6),
    ('invited_to_private_message', 7),
    ('invitee_accepted', 8),
    ('posted', 9),
    ('moved_post', 10),
    ('linked', 11),
    ('granted_badge', 12),
    ('invited_to_topic', 13),
    ('custom', 14),
    ('group_mentioned', 15),
    ('group_message_summary', 16),
    ('watching_first_post', 17),
    ('topic_reminder', 18),
    ('liked_consolidated', 19),
    ('post_approved', 20),
    ('code_review_commit_approved', 21),
    ('membership_request_accepted', 22),
    ('membership_request_consolidated', 23),
    ('bookmark_reminder', 24),
    ('reaction', 25),
    ('votes_released', 26),
    ('event_reminder', 27),
    ('event_invitation', 28),
    ('chat_mention', 29),
    ('chat_message', 30),
    ('chat_invitation', 31),
    ('chat_group_mention', 32),
    ('chat_quoted', 33),
    ('assigned', 34),
    ('question_answer_user_commented', 35),
    ('watching_category_or_tag', 36),
    ('new_features', 37),
    ('admin_problems', 38),
    ('following', 800),
    ('following_created_topic', 801),
    ('following_replied', 802),
    ('circles_activity', 900)
)
-- 通知テーブル (エイリアス n) をクエリし、通知タイプに基づいて ntypes CTE と結合します
SELECT user_id, ntypes.notification_type, read, topic_id, created_at
FROM notifications n
JOIN ntypes
ON n.notification_type = ntypes.notification_type_id
-- 通知を特定のユーザーと特定のトピックに属するものだけに絞り込みます
WHERE user_id = :user_id
AND topic_id = :topic_id
-- 結果の通知を created_at タイムスタンプの降順で並べ替えます
ORDER BY created_at DESC

VALUES はリストが長い場合に便利で、クエリを読みやすくすることができます。また、作成した新しい一時テーブルを別のテーブルにリンクすることもでき、非常に便利です。一時テーブルは、一連の CASE ステートメントと比較して効率を向上させることもできます。

そこで、次に紹介するのが…

CASE

あるいは、リストがずっと小さい場合は、同様の効果を得るために CASE を使用することもできます。これは post_type の例です。

-- [params]
-- topic_id :topic_id

SELECT p.id AS post_id,
 -- post_type の数値コードを文字列の説明にマッピングする CASE ステートメントを開始します
        CASE
          WHEN post_type = 1 THEN 'regular'
          WHEN post_type = 2 THEN 'moderator_action'
          WHEN post_type = 3 THEN 'small_action'
          WHEN post_type = 4 THEN 'whisper'
        END
FROM posts p
WHERE p.topic_id = :topic_id
ORDER BY created_at DESC

これらのサンプルクエリは単独ではあまり役に立たないかもしれませんが、原則を示すためのものです。お役に立てば幸いです。ご不明な点がございましたら、以下でお気軽にお尋ねください。:slight_smile:

「いいね!」 13