SOQL

SOQLの基礎

  • 2019.05.26

概要 本記事では、SOQLの基礎的な事項を実行のサンプルコードをベースにして整理しております。まずSOQLとは、Salesforce Object Query Languageの略であり、データベース(オブジェクト)から必要となるデータを取得する際に利用するものとなります。一般的なSQLとの違いは、いくつかありますが一つはSQLでは複数のテーブルを自由に条件指定することで結合してデータを抽出することができますが、SOQLではオブジェクト同士にリレーションがある場合にのみ結合することができます。また、SQLの’UPDATE’や’DELETE’のようなDMLはSOQLでは使用できないので、Apexで実行する必要があります。 Apexの中でSOQLを実行する2つの方法(静的SOQL、動的SOQL)から紹介します。 静的SOQL(インラインSOQL) Apexでは[ ]句によって、静的なSOQLを記載することができます。[ ]句の中では、 下記のようにバインド変数を使用することで条件を指定できます。 動的SOQL Apexの処理の中で実行するSOQLを動的に編集することができます。実行するSOQL文をStringでDatabase.queryに渡すことができます。SOQLの中で一つのレコードの取得に限定しているのであれば、sObjectで受けることができます。 複数件以上のレコードを取得するのであれば、sObjectのリストで受けます。 サンプルは下記の通りとなります。 また、バインド変数を使用しない例では下記のようにSOQL文を組み立てることもできます。 SOQLの構文(演算子) SOQLで使用することができる各構文(演算子)を記載していきます。 =(等号) >,<,>=,<=(不等号) INCLUDES/EXCLUDES 複数選択リストでの条件を指定する際に使用します。下記の例では、PassportおよびAadhar Card、もしくはPAN Cardのレコードを抽出する条件となります。 LIKE SQLで使用するのと同じように部分一致の検索を行う際に使用します。% と _ がワイルドカードしてサポートされています。%は、0文字もしくは複数の文字列を表します。_は、1文字を表します。 IN SQLで使用するのと同じように複数の項目をOR条件で一致する値を指定する際に使用します。 NOT IN SQLで使用するのと同じように複数の項目をOR条件で一致しない値を指定する際に使用します。 SUBQUERY IN句/NOT IN句には、リレーションがある子オブジェクト、または親オブジェクト条件で指定することができます。 子オブジェクトを条件に指定 親オブジェクトを条件に指定 LIMIT 取得するレコードの上限を指定できます。 OFFSET 取得するレコードの開始行を指定することができます。 GROUP BY ある項目で集計することでCOUNT/SUM/MAX/MIN関数を使用することが集計単位ごとの値を算出できます。 GROUP BY ROLLUP GROUP BYにの機能に加えて、実行結果に小計行を出力されることができます。 [実行結果イメージ] [実行結果イメージ] HAVING GROUP BYで集計した結果に対して、取得するレコードの条件を付与します。 リレーションを使用した値の取得、および条件指定 子から親へのアクセス 子オブジェクトから親オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目により辿って親オブジェクトの所定の項目を指定できます。 カスタムオブジェクトの場合には、項目のAPI参照名の__cの部分を__rに変換して記載することになります。 親から子へのアクセス 親オブジェクトから子オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目の子リレーション名により辿って子オブジェクトの所定の項目を指定できます。contactsが子リレーション名になります。 カスタムオブジェクトの場合には、子リレーション名に__rを付与して記載することになります。 参考 動的SOQLhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dynamic_soql.htm複数選択リストのクエリhttps://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_querying_multiselect_picklists.htm