ブログ

SOQLとSOSLの違いとは 使い分けと基本を分かりやすく解説

#Salesforce #SOQL #SOSL

積極採用中
セミナー情報

はじめてApexを書くとき、必ずぶつかるのが「SOQLとSOSL、どちらを使えばいいのか」という疑問です。

本記事では、何が違うのか/いつどちらを使うのか/最低限の基本構文を解説していきます。併せて開発コンソールのQuery Editorでの実行や、ガバナ制限・セキュリティの注意点も最短で把握できるように構成しました。

SOQL・SOSLどちらを使用するのか迷うことなく、Salesforceの開発ができるようになりましょう。

SOQLとSOSLの違いとは?


SOQLとSOSLはどちらもSalesforceがオブジェクトとして持っているデータを参照するためのSQLです。では、何が異なるのか。一言で言えば、SOQLは「特定オブジェクトのレコードを条件で絞り込むクエリ」、SOSLは「複数オブジェクトをまたいでキーワード全文検索するクエリ」です。

それでは、もう少し具体的に見ていきましょう。

SOQLとは

SOQLとは、Salesforce Object Query Languageの略で、特定のオブジェクトに対して、項目、条件、並び順などを指定して、レコードを取得するための言語です。
どのオブジェクトからレコードを取得したいのかわかっている場合に使用します。

             
SELECT Id, Name
FROM Account
WHERΕ Name = 'Sandy'
             

 
上記のSOQL文は、項目「Id」「Name」をAccountオブジェクトから「Name」=”Snndy”という条件で取得するためのSOQLとなっています。
SOQLの主要句には、SELECT / FROM / WHERΕ / ORDER BY / LIMIT などがあります。詳しくは後の章で確認しましょう。
(SOQL文参照:Salesforce Object Query Language (SOQL)

SOSLとは

SOSLとは、Salesforce Object Search Languageの略で、指定した検索語を指定した範囲内で検索するための言語です。

                     
FIND {“Snndy”}
 IN  Name FIELDS
RETURNING Account(Id,Name),
                      Contact(Id,Name)
                     

 
上記のSOSLは、「Name」= ‘Acme’であるレコードをすべてのオブジェクトから検索しています。
該当したレコードがあれば、取引先、取引先責任者オブジェクトに限定し、「Id」「Name」項目を返すSOSLとなっています。

テキスト・メール・電話などのフィールドを複数オブジェクト横断で探したい際にも使用すると便利です。

使い分けの判断基準


例のSOQL、SOSL文を見て、すでに察しが付いている方もいるかもしれませんが、ここでSOQL、SOSLのどちらを使用するかについて考えていきましょう。
結論からいいますと、特定のオブジェクトからデータを取得したい場合はSOQLを、検索対象のオブジェクトがわからない、または複数ある場合に使用するのがSOSLです。

先ほどの2つの例で考えてみましょう。
①項目「Id」「Name」をAccountオブジェクトから「Name」=”Snndy”という条件で取得したい。
この場合、”Snndy”というのが取引先オブジェクトの「Name」項目であることがわかっています。

②項目「Name」が’Acme’であるレコードがあれば、取引先オブジェクト、取引先責任者オブジェクトから取得したい。
この場合、「Name」が’Acme’であることはわかっていますが、それが取引先の項目か取引先責任者の項目かわかっていません。

このようにSOQL、SOSLのどちらを使用するかは、実行者が探したいデータは何か、探したいデータがどこにあるのかをわかっているかどうかで決まります。

基本構文

状況に合わせてSOQL、SOSLのどちらを使用するかを考えたところで、双方の基本構文について知っておきましょう。

SOQLの基本

SOQLの基本構文は、取得したい情報の項目フィールドをSELECTで、オブジェクトFROMて指定します。また、WHERΕを使用することで取得するレコードを条件で絞ったり、LIMITで件数を指定することもできます。

                     
SELECT 
FROM 
WHERΕ 
ORDER BY  ASC|DESC
LIMIT 
                     

 
主要な構文

SELECT 項目名 取得する項目を指定する
「,」で繋げることで複数指定可能
FORM オブジェクト名 取得する項目を絞りこむ条件を指定する
WHER  取得する項目を絞りこむ条件を指定する
「AND」や「OR」を使用することでより複雑な条件が指定する
ORDER BY ASC(DESC) 項目名 結果を指定した項目順で昇順(降順)で取得する
LIMIT レコード数 取得するレコード数を指定する

 

FIELDS()関数

特定のオブジェクトの全項目をざっと見たい場合は FIELDS(ALL | STANDARD | CUSTOM) が使えます。
覚えておくと便利です。

             
SELECT FIELDS(ALL)
FROM Account
LIMIT 50
             

 
上記のSOQLで取引先オブジェクトの50レコードを全項目取得することができます。

SOSLの基本

             
FIND '{“検索語”}
IN 項目名 FIELDS
RETURNING
  オブジェクト名(項目名),
  オブジェクト名(項目名)
             

 
SOSLは必ずFINDから始まります。
IN … FIELDSで検索対象の項目、RETURNINGでオブジェクトと返す項目を定義します。
全ての項目を検索対象としたい場合は、IN ALL FIELDSを使用します。

主要な構文

FIND ‘{“検索語”} 検索したい検索語を指定する
IN 項目名 FIELDS 検索語を検索する項目を指定する
「,」で繋げることで複数指定可能
RETURNING
オブジェクト名(項目名)
検索条件に合致したレコードを返すオブジェクト、項目を指定する
「,」で繋げることで複数指定可能
ORDER BY ASC(DESC) 項目名 結果を指定した項目順で昇順(降順)で取得する
LIMIT レコード数 取得するレコード数を指定する

 
検索したいキーワードが部分的にしかわからない場合は、ワイルドカードを使用すると良いです。

例えば、「田中太郎株式会社」という取引先名の「田中◯◯株式会社」と”太郎”以外の部分が判明しているとしましょう。
この場合のSOSLは以下のようになります。

             
FIND {“田中*株式会社”}
IN ALL FIELDS
RETURNING
  Account(Id, Name)
             

 
その他、便利な構文や関数もありますので、興味のある方はぜひ公式ヘルプページをご覧ください。
SOQL SELECT の例 | SOQL および SOSL リファレンス | Salesforce Developers

開発者コンソール / Apex からの実行

それではSOQL、SOSLの実行場所について確認しておきましょう。

  • 開発コンソールのQuery Editor:SOQL/SOSLをそのまま実行できます(UIで試すのに最適)。

  • (開発コンソール Query Editor)

    試しに例に出したSOSL文を入力し、実行してみましょう。

    SOSLで指定した通り、「田中〜株式会社」のNameを持つレコードを取得することができました。

  • Apex:角括弧([ … ])でSOQL/SOSLを書くと、結果をリストとして受け取ることができます。

  • ※Apexの中で、SOSLを記載する際には、検索語を「{ }」で囲む必要はありません。

    それではこのApexクラスを匿名で実行してます。

    先ほどと同様に、「田中〜株式会社」のNameを持つレコードを取得することができました。

ガバナ制限・性能の基本

SOQL、SOSLを使用する際は、ガバナ制限を考慮する必要があります。
ガバナ制限とは1回の処理で使ってよいリソース(SOQL回数・DML回数・CPU時間・取得行数など)の上限のことを言います。

レコードを取得するときはなるべく、必要なレコード、フィールドに絞って取得するようにしましょう。

  • SOQL:1トランザクションで合計 50,000 行まで取得できます。
  • SOSL:1回のSOSLで 2,000 件まで取得できます。

その他にも条件によりガバナ制限が変わってきますので、詳しく知りたい方はこちらをご覧ください。
Execution Governors and Limits | Apex Developer Guide

セキュリティを考慮したデータアクセス

最後にSOQL、SOSLのセキュリティに関しても押さえておきましょう。
SOQL、SOSLを使用する際には、実行ユーザが本来参照してはいけないデータを取得できていないかなどのセキュリティ面の考慮も大切です。
現在、Salesforce公式が推奨している設定がWITH USER_MODEです。
ユーザーの権限に基づいて、SOQL、SOSLを使用することができます。
ユーザが本来参照できないレコードを取得しようとするとエラーになります。


(Apex内で使用したSOSL文)

まとめ

今回は、SOQL、SOSLについて、その違いから実際の使い方まで紹介しました。
以下の4点を押さえておくことで、迅速かつ安全にSOQL、SOSLを使用することができるでしょう。

①対象オブジェクトが明確 → SOQL(構造化・絞り込み・集計が得意)。

②キーワードで横断検索したい → SOSL(全文検索・複数オブジェクトが得意)。

③Developer Consoleで即検証 → Apexへ組み込み。

制限とセキュリティを早めに組み込む(ガバナ&WITH USER_MODE)。

<Salesforce>
弊社ではSalesforceをはじめとするさまざまな無料オンラインセミナーを実施しています!
>>セミナー一覧はこちら

また、弊社ではSalesforceの導入支援のサポートも行っています。ぜひお気軽にお問い合わせください。
>>Salesforceについての詳細はこちら
>>Salesforceの導入支援実績はこちらからご覧いただけます!

医療業界に特化した営業支援、顧客管理(SFA/CRM)のコンサルティングも提供しております。こちらもぜひお気軽にお問い合わせください。
>>顧客管理(SFA/CRM)のコンサルティングの詳細はこちら

CONTACT
お問い合わせ

ご相談やご依頼、病院マスタなどについてのお問い合わせはこちらのお問い合わせフォームから。

サービスなどについてのお問い合わせ 病院マスタについてのお問い合わせ

メールお問い合わせ