SOQLとは
SOQL および SOSL リファレンスによると、
Salesforce Object Query Language (SOQL) を使用して、組織の Salesforce データから特定の情報を検索できます。SOQL は、広く使用されている SQL (Structured Query Language) の SELECT ステートメントに似ていますが、Salesforce データ専用に設計されています。
↑をちょっとだけわかりやすくすると
SOQLは、SQLの構文と似ていて、オブジェクトから特定のレコードを取得する際に利用できます。SOQLは開発者コンソールなどから使用することができますが、システム管理者として使用することが多いのはデータローダでのExportではないかと思います。
SQLをこれまで使用していた方であればすでに使いこなしている人も多いと思いますが、そうでないシステム管理者へ向けて、私がよく使用している構文をご紹介いたします。
すべて知りたい方はこちらの
SOQL および SOSL リファレンスでご確認ください。
SOQL SELECT の構文
SOQLクエリ構文は、必須の SELECT ステートメントとそれに続く1つ以上の省略可能な句 (TYPEOF、WHERE、WITH、GROUP BY、ORDER BY など) で構成されます。
必須の部分はデータローダでExportする際に項目を選択すると自動的に入力されていると思います。
この記事では主に任意の箇所についてご紹介していきます。
↑のように改行をしてもしなくても出力に影響はありません。
子から親の項目を参照する(リレーション名)
私が最初に先輩に教わったものです。
標準項目の場合は「項目名
(-Id).親の項目名」
カスタムオブジェクトの場合は「項目名__
r.親の項目名」
取引先責任者のリレーション項目を例に入力方法をご説明いたします
例)取引先責任者の名前と、関連付けられた取引先名を取得する
SELECT Name, Account.Name from Contact |
開発者コンソールで実行した結果です。 親から子の取得もできます。詳しく知りたい方は
こちらでご確認ください。
条件式の構文 (WHERE 句)
レポートでの「検索条件」のように取得するレコードの条件を指定するときに使います。
完全一致(=)
例)取引先の ポテンシャルが“Aランク” の取引先ID、名前、ポテンシャルを取得する
SELECT Id,Name,Potential__c FROM Account WHERE Potential__c = 'Aランク' |
開発者コンソールで実行した結果です。一致しない(!=)
例)取引先の ポテンシャルが“NULL”でない 取引先のID、名前、ポテンシャルを取得する
SELECT Id,Name,Potential__c FROM Account WHERE Potential__c != null |
開発者コンソールで実行した結果です。
あいまい検索(LIKE)
例)取引先の 名前が株式会社○○ のID、名前を取得する
SELECT Id,Name FROM Account WHERE Name LIKE '株式会社%' |
開発者コンソールで実行した結果です。
・LIKE 演算子では
% と
_ のワイルドカードが使えます。
・
% ワイルドカードは、0 個以上の文字に一致します。
・
_ ワイルドカードは、1 文字のみに一致します
・文字列のみ使用できるので、ロングテキストエリアには使用できません。
その他の詳細情報は
こちらでご確認ください。
いずれかに等しい(IN)
例)取引先の ポテンシャルが“Aランク”または“Bランク” の取引先のID、名前、ポテンシャルを取得する
SELECT Id,Name,Potential__c FROM Account WHERE Potential__c IN ('Aランク', 'Bランク') |
開発者コンソールで実行した結果です。
いずれも一致しない(NOT IN)
例)取引先の ポテンシャルが“Aランク”でも“Bランク”でもない 取引先のID、名前、ポテンシャルを取得する
SELECT Id,Name,Potential__c FROM Account WHERE Potential__c NOT IN ('Aランク', 'Bランク') |
開発者コンソールで実行した結果です。
こちらの演算子で私が実際に使用していた一例をご紹介します。
本番環境リリース時にシステム管理者以外のユーザを一括で凍結する工程で、Update用のデータを取得するのに使用していました。
例)作業を行うシステム管理者以外のユーザログインの凍結情報を取得します。
Select Id, IsFrozen, UserId FROM UserLogin WHERE UserId NOT IN('0055h000003XXXXXXX','0055h000003XXXXXXX') |
開発者コンソールで実行した結果です。
出力したCSVファイルの「IsFrozen」をfalse → trueに置き換えるか、マッピングのSDLファイルでtrueに指定してUpdateすると一括で凍結にできます。凍結解除の同じファイルを使ってfalseに戻すだけです。SDLファイルの定数の対応付けについては
こちらの記事でご確認ください。
不等号(<,<=,>,>=)
数値や日付の検索で使用します。範囲での検索は
ANDを使用します。論理演算子はAND以外にも
OR、
NOTが使用可能です。論理演算子の詳細は
こちらまた、日付、日付/時間項目の書き方は「/」ではなく「-」です。
データローダを使いなれている方であればご存じだと思いますが、日本時間の場合は「+0900」にするか、9時間マイナスにした値で入力します。
AM11時で指定する場合は以下のよう入力にします。
・2021-10-01
T11:00:00+0900・2021-10-01
T02:00:00Z 例)取引先の 最終更新日が2021/10/1~2021/12/31まで の取引先の名前、最終更新日を取得する
SELECT Name, LastModifiedDate FROM Account WHERE LastModifiedDate >= 2021-10-01T00:00:00+0900 AND LastModifiedDate <= 2021-12-31T00:00:00+0900 |
開発者コンソールで実行した結果です。
また、相対日付のように
YESTERDAY、
TODAY、
LAST_90_DAYSなどの日付リテラルを使用することができます。使用可能な日付リテラルの詳細は
こちらでご確認ください。
並び替え (ORDER BY)
取得結果の並び替えを指定できます。
データローダでExport後にExcelで並び替えをしている方はこちらを加えると作業手順がひとつ減るのではないでしょうか。
ORDER BYの後に並び替える項目を入力したら、後は省略可能です。
指定しない場合は昇順で並び替えになります。
ASC…昇順
DESC…降順
NULLS FIRST…null のレコードを結果の先頭
NULLS LAST…null のレコードを結果の最後 例)取引先の ポテンシャルの値を昇順で値が空白レコードは先頭 で取引先の名前、ポテンシャルを取得する
SELECT Name, Potential__c FROM Account ORDER BY Potential__c ASC NULLS FIRST |
開発者コンソールで実行した結果です。
集計する (AVG()、COUNT()、MIN()、MAX()、SUM())
レポートで集計するように集計関数を使用して集計することができます。
例)取引先IDでグルーピングして商談の最高金額を取得する
SELECT AccountId, MAX(Amount) FROM Opportunity GROUP BY AccountId |
開発者コンソールで実行した結果です。
こちらで紹介した
フローで積み上げ集計(その1)や
(その2)で既存レコード分のメンテナンスにこちらの関数を使用してExportするとUpdateが簡単になります。
上記の例にさらに、「成立した商談」で条件を加えることもできます。
例)取引先IDでグルーピングして成立した商談の最高金額を取得する
SELECT AccountId, MAX(Amount), MIN(Amount), AVG(Amount), COUNT(Amount), SUM(Amount) FROM Opportunity WHERE StageName = '08-受注' GROUP BY AccountId |
開発者コンソールで実行した結果です。
レポートでいいのでは?
今回ご紹介した内容はレポートでも出力可能なものばかりです。
データローダでExport後にExcelで取り込んで関数などでさらに加工される場合は、レポートからExcelでエクスポートして、加工した後にCSVに変換して取り込みファイルを作成した方が簡単だと思います。
ご紹介したユースケースのように加工せずにExportしたファイルをそのままUpdateファイルとして使用できる場合は、SOQLで指定してExportする方が簡単になります。データローダでUpdateを行っている定常業務などの手順を見直すと業務効率化につながるかもしれません。