これは何?
この記事は「24日後に立派なSalesforceエンジニアになるWEBエンジニア Advent Calendar 2022」の20日目の記事です5日後に立派なSalesforceエンジニアになるために今日からはSOQLについて学んでいきます。
SOQLとは?
SOQLとはSalesforce Object Query Languageの略。
SQLのような感じでデータベースにアクセスしてレコードを取得するのに使う。
SELECT Fields FROM ObjectName WHERE Condition
どうやって使うのか?
SOQLはApexやSalesforce CLI、REST API などから呼び出すことができる。
Apexの場合
List<Account> accts = [SELECT Id FROM Account];
Salesforce CLIの場合
sfdx force:data:soql:query -u DevHub --query "SELECT Id FROM Account"
REST APIの場合
GET https://yourInstance.salesforce.com/services/data/v56.0/query?q=SELECT+Id+FROM+Account
Bulk APIの場合
POST https://yourInstance.salesforce.com/services/data/v56.0/jobs/query
{
"operation": "query",
"query": "SELECT Id FROM Account"
}
SQLとの違い
INSERT、UPDATE、DELETE ができない。
SOQLには INSERT、UPDATE、DELETE ステートメントにあたるものが存在しない。なので以下はSELECTにフォーカスを当ててみていこうと思う。
joinが使えない
SOQLはSQLのjoinが使えず、1つのSOQLクエリで複数のObjectからデータを取ってくる時にはリレーションを使う。そのため参照関係が定義されていないオブジェクト同士をくっつけてデータを取得することはできない。
構文の書き方が親から子レコードを参照するときと子から親レコードを参照するときで異なるのでそれぞれ見ていく。
子から親レコードを引いてくる
これは比較的簡単。子から見ると親は1人なので以下のように書くことで、子であるContact
に紐づいた親Account
のName
を参照することができる。
SELECT Account.Name FROM Contact
親レコードから子レコードを引いてくる
先ほどの逆の場合は以下のようにサブクエリを発行することで値を参照する。
SELECT Id,(SELECT Id,Name FROM Contacts) FROM Account
サブクエリ内に書かれているContacts
は子リレーション名と呼ばれるもので、どのような子リレーション名が定義されているかは設定 > オブジェクト > オブジェクト名 > 項目とリレーション > 項目名
の以下の場所から確認ができる。
今回の場合は標準項目の例を挙げたが、カスタム項目で参照項目を作っているときは子リレーション名__r
で指定することになる。
select * が使えない
あと大きく違う点として select *
が使えない。
ただFIELDS()関数を使うと一部制限はあるものの、おおよそ似たような処理は行うことができる。
FIELDS()関数では以下の3種類が用意されている。
関数 | 説明 |
---|---|
FIELDS(ALL) | オブジェクトのすべての項目を選択 |
FIELDS(CUSTOM) | オブジェクトのカスタム項目を選択 |
FIELDS(STANDARD) | オブジェクトの標準項目を選択 |
ただしこれらには項目レベルのセキュリティが考慮されるため、SOQLの実行者が参照権限を持つカラムしか表示されないのでその点は注意が必要。
またこれら3つはそれぞれ以下のように利用制限に差がある部分も把握しておく必要がありそう。
FIELDS(STANDARD) | FIELDS(ALL) と FIELDS(CUSTOM) | |
---|---|---|
Apex | 実行可能 | 不可能 |
Bulk API | 実行可能 | 不可能 |
CLI | 実行可能 | LIMIT 200以下に絞れば可能 |
SOAP API および REST API | 実行可能 | LIMIT 200以下に絞れば可能 |
is NULL ではなく = NULL
今まで書いてきた内容に比べると些細な違いだがSOQLではNULLと一致するものは = NULL
で抜いてくる。
SELECT Account.Name FROM Contact WHERE Phone = NULL
BETWEEN が使えない
これも些細だがbetween A and B
が使えないので<
と>
で代用する。
最後に
今日はSOQLについて、SQLとの違いを中心に学びました。joinが思うようにできないのは、実際コードを書いていて少し辛いシーンもありますが、それ以外はほぼSQLと同様に扱うことができるので、ウェブエンジニアとしては触りやすそうです。
明日はSOQLと似たようなものにSOSLというものがあるので、それについてみていこうと思います。