Adobe Campaignクエリー道場(6)〜CASE式で推し活?!

今回は、お客様から実際にいただいたサポートケースを題材にします[^1]。
そのお客様は、以下のような要件をお持ちでした[^2]:

:::note
クエリー結果を「推し」の順に並べられるようにしたい
:::

どういう意味かよくわかりませんね。例で考えてみます。
クエリー対象スキーマで、あるカラムが以下の値を持つとします:

お菊
お岩
貞子
伽椰子

同スキーマに対するクエリー結果を、「推し」の順にしたい、という要件です[^3]。その順はたとえば:

貞子
お岩
伽椰子
お菊

なんでこの順かといっても、推しに理由はいらない。好きという気持ちが尊いのです。また推し変ということもあり得るので、この順は固定的にスキーマで持ったりせず、「クエリ」アクティビティごとに定義します。
さあこの要件、どう攻略しましょうか。
***
こういう、ある意味で理屈抜きな要件は、単純なようで意外に手を焼くもの。しかし、[前回](https://qiita.com/JJSlider/items/db2ce04818871cf435c5 "Adobe Campaignクエリー道場(5)〜CASE式はシティポップに乗せて")をお読みの方ならもうおわかりですよね。そう、CASE式が使えるのです。具体的に見てみましょう。

スキーマ名を「推し活」、カラムを「推しメン」(＠push)とします。
「クエリ」アクティビティを作成し、ターゲティングディメンジョンに「推し活」を指定:
![2023-11-14_12-36-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/079a76df-320a-f60d-77d2-63c98ff7b030.png)
フィルター条件を適宜指定[^4]。「クエリ」タブに戻って「データを追加...」をクリック:
![2023-11-14_17-19-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/0f809f32-2a60-a692-431e-50eac4a174cd.png)
「追加するデータのタイプを選択」で「フィルタリングディメンジョンにリンクされたデータ」を選択:
![2023-11-14_11-32-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/fe1e48e9-d696-c9bf-f42f-87a0b9c907ce.png)
「追加するフィールドを選択」で「フィルタリングディメンジョンのデータ」を選択:
![2023-11-14_11-37-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/93a880f0-ba1b-daef-e41e-275f84e3f083.png)
「追加するデータ」で「出力列」ペインの「追加」ボタンをクリック:
![2023-11-14_11-41-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/5275ca26-a8e3-b8c6-afac-d34fe96874cc.png)
「式」に以下をコピペ:
```
Case(When(@push='貞子', 1), When(@push='お岩', 2), When(@push='伽椰子', 3), Else(4))
```
見やすいように、ラベルを適宜入力:
![2023-11-14_12-59-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/9da8ee09-dc26-12ef-d930-968a2f1ac334.png)
左ペインで「推しメン」をダブルクリックして出力列に追加:
![2023-11-14_17-13-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/2bc32fbb-eca4-fe53-1578-858da2340fdc.png)
これでできあがりです。
「OK」を２回クリックしワークフローキャンバスに戻って実行。「クエリ」アクティビティからの遷移矢印を右クリックして「ターゲットを表示...」すると:
![2023-11-14_17-44-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/d81e5db9-d618-0e89-2cb6-08a3f3500955.png)
推し順に番号が振られるのでソートができるというわけです。
***
あらためて入力したCASE式を振り返りましょう:
```
Case(When(@push='貞子', 1), When(@push='お岩', 2), When(@push='伽椰子', 3), Else(4))
```
[前回](https://qiita.com/JJSlider/items/db2ce04818871cf435c5 "Adobe Campaignクエリー道場(5)〜CASE式はシティポップに乗せて")はCASE式を使ってラベルを付けましたが、今回は、カラムの値に対して好き勝手に番号を振りました。貞子は1、お岩は2、という具合ですね[^5]。
SQLでは、CASE式を使ってカラムを別のかたちに変換するというテクニックを多用します。Campaignでも「Case()」「When()」「Else()」各関数によってそれが実現できるのです。ここでは任意に定義した数値により、ソートのためだけのカラムを新たに作りました。
名前をつけかえたり番号を振ったりといろいろできるCASE式のテクニック、ぜひ身につけて、日々の実装に活かしていきましょう。
***
いかがでしたか。Campaignクエリーで推し活、とはちょっと意外な応用でしたね。そんな思わぬ要件にであったときは、本連載を読み返してみてください。そしてもし参考になったら、[跡部官辺](https://qiita.com/JJSlider)に「いいね」で推し活を！

::: note warn
本稿の内容は筆者のオンプレミス型デモ環境(Adobe Campaign Classic 9359@c636bf3 PostgreSQL 14.9)上で実施した検証に基づきます。別環境における同様の動作を保証するものではありません。またデータは架空のものであり、既存の配信や実在の組織とはいっさい関係がありません。
:::
[^1]: お客様の特定を避けるため大幅に改変しています。
[^2]: 読みやすさのために本稿のような話の流れにしましたが、アドビ カスタマーサポートではお客様ご要件の実装をサポートケースから提供することはありません。サポートケースで個別ご要件のご相談をいただいても対応できかねますのでご承知おきください。
[^3]: こう聞くと突飛なようですが、そもそもキャンペーンとは売り手が商品を推す活動です。Campaignのビジネス要件では似たような場面がしばしば出てきます。
[^4]: 画面例はフィルター条件を空行にしたものです。
[^5]: Elseでお菊さんを数合わせにしてしまいました。祟らないで。