UNDER THE EDGE

SOQLの使い方を徹底解説!【Salesforce】

こんにちは。自分がよく使うSOQLの構文を自分なりにまとめてみました。
改めてリファレンスみてみると、え、こんなことできるん?ってことも
多々あったんで、その辺にも言及できればと思います。

基本的な使い方

SOQLは『Salesforce Object Query Language』と呼ばれ、SQLに似た構文で
データベースに対してクエリを発行することができます。

ただDML操作(Insertなど)はSOQLでは使えないので、そこはSQLとは違うところになります。

基本的な使い方としてはSQLのデータベースへのクエリを発行するのと同じ容量で

SELECT [fieldName] FROM [ObjectName]

の形で使うことができます。

Where句を使う

SOQLでは、Where句を使って取得するレコードを制限します。
具体的には’Test’という名前の取引先を探したいとなったら下記のように書きます。

SELECT Id,Name FROM Account WHERE Name = 'Test'

これでName項目がTestというレコードを全てとってくることができます。

リレーションを使う

SOQLでリレーションを使う時です。
以下は子から親を参照する場合です。

SELECT Account.Name FROM Contact

標準オブジェクトのリレーションは『オブジェクト名.項目名』が基本になります。
カスタムオブジェクトの場合は『参照項目名__r.参照先の項目名』が基本となります。

次に親から子を参照する場合です。

SELECT Id,(SELECT Id,Name FROM Contacts) FROM Account

上記の形で取引先に関連している取引先責任者を取得することができます。
サブクエリ内でコールしているクエリのFROMの後にあるのは子リレーション名になります。
カスタム項目で参照関係を作成した場合は『子リレーション名__r』となるので注意しましょう。

以前に図解付きで説明しています。
詳しくはこちらでどうぞ

Nullを使う

SOQLで項目に値が入っていないものを検索する場合に使います。
SQLでは『is Null』を使うと思いますがSOQLでは

SELECT Id,Name,MobilePhone FROM Account WHERE MobilePhone = Null

でOKです。

比較演算子を使う

SOQLでは比較演算子を使えば数値項目や日付項目に対して条件をより細かく使うことができます。
例えば商談で商談の金額が10000円以上のレコードを抽出したい時は下記のように書きます。

SELECT Id,Amount FROM Opportunity WHERE Amount >= 10000

SOQLの比較演算子は11種類あります。

  • =
  • !=
  • <
  • <=
  • >
  • >=
  • LIKE
  • IN
  • NOT IN
  • INCLUDES
  • EXCLUDES

LIKE句はあいまい検索に使います。

SELECT Id,Name FROM Account WHERE Name LIKE 'Test%'

%ワイルドカードは、0個以上の文字に一致。
_ワイルドカードは1文字のみに一致。
この二つは抑えておきましょう。またLIKE句は文字列のみに使えます。
そのためロングテキストエリアには使えないので注意しましょう。

IN句は指定した値のいずれかに合致するレコードを返します。NOTはその逆です。

SELECT Id,Name FROM Account WHERE Name IN ('Test','テスト')

INCLUDES、EXCLUDESは複数選択リストの値を取得する際に使います。
複数選択リストの指定は『;』セミコロンを使います。

論理演算子を使う

WHERE句内では複数の条件をつけることもできます。
AND、OR、NOTがあります。

TestもしくはテストというNameをもつAccountを返します。

SELECT Id,Name FROM Account WHERE Name = 'Test' OR Name = 'テスト'

NameがTestかつ取引先ソースがWebのAccountを返します

SELECT Id,Name FROM Account WHERE Name = 'Test' AND AccountSource = 'Web'

NameがTestかつ取引先ソースがWebもしくはNameがテストかつ取引先ソースがPhone InquiryのAccountを返します。

SELECT Id,Name FROM Account WHERE (Name = 'Test' AND AccountSource = 'Web') OR ( Name = 'テスト' AND AccountSource = 'Phone Inquiry')

日付形式

日付形式は『/』ではなく『-』を使います。
・日付:2020-01-25
・日付/時間:2020-01-25T00:00:00+0900
※書き方は他にもありますが僕はこれを覚えてます。
SOQL内では比較演算子と使うことによって期間をとることができます。

SELECT Id FROM Account CreatedDate >= 2019-12-01T00:00:00+0900 AND CreatedDate <= 2019-12-31T23:59:59+0900

SQLのBetweenは使うことができません。

また日付リテラル、Yesterday、Today、TomorrowやLAST_N_DAYS:n(←nに数値を入れる)のように指定した日付を
簡単に抽出することができます。

詳細はこちらをご覧ください。

並び替えをしてみる

ORDER BY句を使えばレコードの並び順を変更することができます。

SELECT Id,Name,AccountSource FROM Account ORDER BY Name,AccountSource

上記のように複数の項目を指定することができます。
またASC(昇順)、DESC(降順)で指定することもできます。
なにも付けなければデフォルトでは昇順の並びになります。
また項目に何も値がない『Null』だった場合に先に並べるか、後に並べるかを選択することもできます。

FIRSTで先頭に指定項目のNullのレコードを、LASTで最後に並び替えができます。

指定した件数のレコードを取得する

指定件数を取得する際はLIMIT句を使います。
LIMIT句ではガバナ制限の回避をすることにも役立ちますので覚えおきましょう。
LIMITという名前通り、指定した数分のレコードを出力します。

SELECT Id,Name FROM Account LIMIT 5

またOFFSET句を指定すれば指定した数字分のレコードをスキップしてそこからのレコードを取得できます。
たとえば組織に取引先のレコードが100件あった場合に、OFFSET句で最初の10件はスキップして
11件目から取得することができます。

SELECT Id,Name FROM Account LIMIT 100 OFFSET 10

集計関数を使う

集計関数は平均、件数、件数(重複除外)、最小、最大、集計などがあります。
例えば商談オブジェクトにおいて成立している商談の全ての金額の合計を取得するとします。

SELECT sum(Amount) FROM Opportunity WHERE StageName = 'Closed Won'

GROUP BY句を使うことでNameごとの商談金額をとることもできます。

SELECT Name, sum(Amount) FROM Opportunity WHERE StageName = 'Closed Won' GROUP BY Name

注意すべきなのは返却される型です。
GROUP BYを使った際はAggregateResult型になります。
型で悩まされることもあるかもなので一応書いておきます。


その他の開発に関する記事はこちらです。

Developerも含めた試験問題にチャレンジしてみましょう。


Salesforce
Account Engagement
CRM Analyticsの導入支援、
AppExchange
開発支援でお悩みなら
今すぐご相談ください

お問い合わせはこちら