3
4

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.

Salesforce では、保存したレコードの読み込みに使用できる Salesforce Object Query Language (SOQL) を提供しています。SOQL は、標準の SQL 言語と似ていますが、Lightning Platform 用にカスタマイズされています。また、Apex に埋め込まれた SOQL は、インライン SOQL と呼ばれます。この記事では基本的な所から詳しく説明します。

1.実践で構文を学ぶ

soqlの基本的な構文は他SQLとそんなに変わりません、基本的な SOQL クエリの構文を次に示します。

SELECT fields FROM ObjectName [WHERE Condition]

SELECT句、FROM句 WHERE 句で構築されWHERE 句は省略可能です。SELECT句で欲しいレコードを指定し検索するテーブルをFROM句で指定レコード詳しい条件加える場合はWHERE 句、まず簡単なクエリから始めましょう。

1-1.基本的な構文を実践しよう

まず、salesforce組織にログインしましょう。
image.png
次はコンソルを開きましょう。
image.png
image.png
SOQL文を実行してみよう。

SELECT Name, Company, Email, Status FROM Lead

実行結果を確認することができる。
image.png
オブジェクトマネージャーからLeadを確認しましょう。
image.png
image.png
image.png
image.png
項目とリレーションを選択して項目名を参照して指定するレコード名を知ることができる。
image.png

1-2.WHERE 句とOR句やAND句を実践してみよう。

検索するレコードに条件追加する場合はWHERE 句を使う、二つ以上の条件追加はどっちかを満たせば十分の場合はORを使う。必ずどっちも満たす場合はANDを使う。
まず、WHERE 句を確かめましょう。

SELECT Name, Status, Company, Email FROM Lead WHERE Status='Closed - Converted' 

image.png
次にOR条件を使ってみよう。

SELECT Name, Status, Company, Email FROM Lead WHERE Status='Closed - Converted' OR Status='Closed - Not Converted'

これで項目名StatusがClosed - ConvertedとClosed - Not Convertedのレコードが両方選び出された
image.png
最後はAND条件を追加してみましょう。

SELECT Name, Status, LeadSource, Company, Email FROM Lead WHERE (Status='Closed - Converted' OR Status='Closed - Not Converted') AND LeadSource='Web'

これで項目名StatusがClosed - ConvertedとClosed - Not Convertedのレコード且つ項目名LeadSourceがWebのレコードのみが選択された
image.png

1-3.IN句とLIKE句追加

レコードの複数条件指定はINを使う、レコードのキーワード指定はLIKEを使う。
OR条件を外してINを指定しましょう。

SELECT Name, Status, LeadSource, Company, Email FROM Lead WHERE Status IN ('Closed - Converted', 'Closed - Not Converted') AND LeadSource='Web'

OR指定した条件と同じ役割を果たしました
image.png
条件を外してLIKEを指定しましょう。前方一致の場合は'keyword%',後方一致の場合は'%keyword',完全一致の場合は'%keyword%'.

SELECT Name, Status, LeadSource, Company, Email FROM Lead WHERE Status LIKE 'Closed%' AND LeadSource='Web'

Status項目名がClosedで始まる、LeadSource項目名がWebのものが選択されました。
image.png

1-4.「ORDER BY」句を使うソート

ORDER BYはソートを行ってくれる機能、その基本的な使い方を実践しましょう。まず、Nameレコード昇順でソートしてみる。

SELECT Name, Status, LeadSource, Company, Email FROM Lead ORDER BY Name

AーZの順番でNameで表示しました。
image.png
次はNameレコード降順で並べてみる、命令最後にDESCを追加する

SELECT Name, Status, LeadSource, Company, Email FROM Lead ORDER BY Name DESC

image.png

1-5.LIMIT句とOFFSET句

LIMIT 句を使用することで取得するデータの数を指定することができます。OFFSET 句を使用するとどの位置からデータを取得するのかを指定することができる。

取得数をLIMIT 句で制限してみよう。

SELECT Name, Status, LeadSource, Company, Email, CreatedDate FROM Lead LIMIT 10

image.png
普通にデータを取得する場合とOFFSETで取得開始制限を加えた場合と比べてみよう。

SELECT Name, Status, LeadSource, Company, Email, CreatedDate FROM Lead

image.png

SELECT Name, Status, LeadSource, Company, Email, CreatedDate FROM Lead OFFSET 5

5番目のデータから取得開始するようになった
image.png

2.主従関係/参照関係にある子から親/親から子を参照SOQL

soqlは他のsql言語と違い内部結合及び外部結合などクエリはありません。お互い参照する場合は必ずしも親子関係が必要である。ここでは子から親/親から子を参照の両方クエリを紹介します。

2-1.親オブジェクトと子オブジェクトの確認

まず、組織にログインしてアプリケーションランチャーを開きましょう。次はセールスを開きましょう。
image.png
取引先を選択しましょう。
image.png
適当項目を開きましょう。
image.png
関連ページで書いてあるオブジェクトが取引先の子リレーションのオブジェクトである
image.png
設定を開きましょう。
image.png
オブジェクトマネージャーを開きましょう。
image.png
取引をクイック検索で入力し、親オブジェクトである取引先と子オブジェクトである取引先責任者のAPI参照名を確認しましょう。
image.png

2-2.親から子を参照するクエリ

開発者コンソルを開いて以下クエリを実行してみよう。

SELECT Name, Phone, Website, (SELECT Name, Department, Email FROM Contacts) FROM Account

このように子リレーションオブジェクトのレコードのクエリを挟むことで親から子を参照することができる。
image.png

2-3.子から親を参照するクエリ

開発者コンソルを開いて以下クエリを実行してみよう。

SELECT Name, Phone, Department, Account.Name, Account.Website FROM Contact

このように親オブジェクト名で呼び出しすることができる。
image.png

3.Apex 変数の使用のSOQLクエリ

SOQLは直接Query Editorで直接実行する以外にApexで応用することも非常に多い、このセクションでApexコードでの基本的な使い方を紹介します。

3-1.list型とmap型のsoql応用

まず、開発者コンソルを開いてDebugメニューのOpen Execute Anoymous Windowを選択する
image.png
image.png
次はlist型の配列にSOQLを代入しましょう。

List<Account> accounts = [SELECT Name, Phone FROM Account];


for(Account account : accounts){
    System.debug('Account Name: '+account.Name+' Account Phone: '+account.Phone);
}

実行結果を確認しましょう。検索条件にふさわしいレコードを全て取り出した
image.png
Map型はidをkeyとして、Accountをmapとすればlist型の配列と同じ結果を出せる

Map<Id, Account> accountsMap = new Map<Id, Account>([SELECT Name, Phone FROM Account]);
for(Account account : accountsMap.values()){
    System.debug('Account Name: '+account.Name+' Account Phone: '+account.Phone);
}

image.png

3-2.親から子参照するクエリをApexに応用

親から子を参照するSOQLをListに代入する。循環内に循環を挟む方法で子リレーションに必要なレコードを取り出す

List<Contact> contacts = [SELECT Account.Name, Account.Rating, Name, Department, Title, (Select CaseNumber, Subject FROM Cases) FROM Contact ORDER BY Name];

for(Contact con : contacts){
    System.debug('Contact Name: '+con.Name+', Contact Department: '+con.Department+', Contact Title: '+con.Title+', Account Name: '+con.Account.Name+', Account Rating: '+con.Account.Rating);
    // iterate over the child records (Cases)
    for(Case caseObj : con.Cases){
        System.debug('Case Number: '+caseObj.CaseNumber+', Case Subject:'+caseObj.Subject);
    }
}

image.png

3-3.配列を利用する複数条件検索

検索したいキーワードを含む配列accountNames を作成しましょう。INクエリを使いaccountNamesを条件として指定する検索クエリを代入するリストaccounts を作成しましょう。

List<String> accountNames = new List<String>();
accountNames.add('Sample SObject Account');
accountNames.add('New Line Cinema');
accountNames.add('SFDCFacts');
accountNames.add('Burlington Textiles Corp of America');

List<Account> accounts = [SELECT Id, Name, Phone, Rating FROM Account
                         	WHERE Name IN :accountNames];
System.debug('Accounts: '+accounts);
System.debug('Accounts Size: '+accounts.size());

実行結果を確かめましょう。オブジェクトに存在するアカウント名のキーワードのみ検索された。
image.png

まとめ

以上がSOQLの基本的な構文と応用でした、今後はもっと研究してより複雑な応用を紹介します。

3
4
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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?