17
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

これは何?

この記事は「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に紐づいた親AccountNameを参照することができる。

SELECT Account.Name FROM Contact

親レコードから子レコードを引いてくる

先ほどの逆の場合は以下のようにサブクエリを発行することで値を参照する。

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

サブクエリ内に書かれているContactsは子リレーション名と呼ばれるもので、どのような子リレーション名が定義されているかは設定 > オブジェクト > オブジェクト名 > 項目とリレーション > 項目名の以下の場所から確認ができる。
スクリーンショット 2022-12-14 22.56.03.png
今回の場合は標準項目の例を挙げたが、カスタム項目で参照項目を作っているときは子リレーション名__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というものがあるので、それについてみていこうと思います。

17
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?