この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

SOQL SELECT の構文

SOQL クエリ構文は、必須の SELECT ステートメントとそれに続く 1 つ以上の省略可能な句 (TYPEOFWHEREWITHGROUP BYORDER BY など) で構成されます。

SOQL SELECT ステートメントでは、次の構文を使用します。

1SELECT fieldList [subquery][...]
2[TYPEOF typeOfField whenExpression[...] elseExpression END][...]
3FROM objectType[,...] 
4    [USING SCOPE filterScope]
5[WHERE conditionExpression]
6[WITH [DATA CATEGORY] filteringExpression]
7[GROUP BY {fieldGroupByList|ROLLUP (fieldSubtotalGroupByList)|CUBE (fieldSubtotalGroupByList)} 
8    [HAVING havingConditionExpression] ] 
9[ORDER BY fieldOrderByList {ASC|DESC} [NULLS {FIRST|LAST}] ]
10[LIMIT numberOfRowsToReturn]
11[OFFSET numberOfRowsToSkip]
12[{FOR VIEW  | FOR REFERENCE} ]
13[UPDATE {TRACKING|VIEWSTAT} ]
14[FOR UPDATE]
構文 説明
fieldList subquery 指定した object から取得する、1 つ以上の項目のカンマ区切りのリストを指定します。次の例の太字の要素が fieldlist 値です。
  • SELECT Id, Name, BillingCity FROM Account
  • SELECT count() FROM Contact
  • SELECT Contact.Firstname, Contact.Account.Name FROM Contact
  • SELECT FIELDS(STANDARD) FROM Contact
有効な項目名を使用し、指定項目ごとに参照レベルの権限を含めます。fieldList はクエリ結果内の項目の順序を定義します。
クエリでリレーションをトラバースする場合、fieldList には、サブクエリを含めることができます。次に例を示します。
1SELECT Account.Name, (SELECT Contact.LastName FROM Account.Contacts)
2FROM Account

fieldlist は、COUNT()COUNT(fieldName) などの集計関数とすることも、返された結果を翻訳する toLabel() 関数でラップすることもできます。詳細は、「SELECT」を参照してください。

typeOfField 複数のオブジェクト��別を参照できる、objectType の多態的なリレーション項目、または objectType の親の多態的な項目。たとえば、Task の Who リレーション項目には、Contact または Lead のいずれかを使用できます。typeOfField は、fieldList でも参照されているリレーション項目は参照できません。詳細は、「TYPEOF」を参照してください。
whenExpression WHEN whenObjectType THEN whenFieldList という形式の句。TYPEOF 式内には、1 つ以上の whenExpression 句を使用できます。詳細は、「TYPEOF」を参照してください。
elseExpression ELSE elseFieldList という形式の句。これは、TYPEOF 式内の省略可能な句です。詳細は、「TYPEOF」を参照してください。
objectType query() の対象オブジェクトの種別を指定します。Account など、有効なオブジェクトを指定します。そのオブジェクトの参照レベルの権限を持っている必要があります。
filterScope API バージョン 32.0 以降で使用できます。filterScope は、クエリの結果を制限するために指定します。
conditionExpression WHERE が指定されている場合は、指定したオブジェクト (objectType) 内で絞り込みをする行と値が判断されます。指定されていない場合、query() はオブジェクト内でユーザーが参照可能なすべての行を取得します。
filteringExpression WITH DATA CATEGORY が指定されている場合、query() は指定したデータカテゴリに関連付けられていて、ユーザーが参照可能な、条件に一致するレコードのみを返します。指定されていない場合、query() はユーザーが参照可能な、条件に一致するレコードを返します。WITH DATA CATEGORY 句は次の種別のオブジェクトのみを絞り込みます。
  • Question — 質問を照会します。
  • KnowledgeArticleVersion — 記事を照会します。
「WITH DATA CATEGORY」を参照してください。
WITH DATA CATEGORY が指定されていない場合、filteringExpression を使用して、項目およびオブジェクトレベルの権限を強制したり、Apex コードでユーザーまたはシステムモードのアクセスを指定したりできます。
SECURITY_ENFORCED
WITH SECURITY_ENFORCED 句は、Apex コード内で照会する項目またはオブジェクトへのユーザーアクセス権限に基づいてレコードを絞り込むために使用します。『Apex 開発者ガイド』「WITH SECURITY_ENFORCED を使用した SOQL クエリの絞り込み」を参照してください。
USER_MODE または SYSTEM_MODE
Apex データベース操作のユーザーモードまたはシステムモードアクセスを指定します。デフォルトでは、Apex コードはシステムモードで実行されます。つまり、コードを実行しているユーザーよりも非常に上位の権限で実行されます。Apex のセキュリティコンテキストを強化するために、WITH USER_MODE を使用してユーザーモードアクセスを指定できます。システムモードとは異なり、ユーザーモードでは実行ユーザーの項目レベルセキュリティ (FLS) とオブジェクト権限が考慮され、共有ルールが適用されます。『Apex 開発者ガイド』「ユーザーモードでのデータベース操作 (ベータ)」を参照してください。
fieldGroupByList API バージョン 18.0 以降で使用できます。クエリ結果をグループ化するために使用される 1 つ以上の項目のカンマ区切りのリストを指定します。GROUP BY 句は、データを集計するために、集計関数と共に使用します。この句によって、コード内で個々のレコードを処理せずに、クエリ結果を積み上げ集計できます。「GROUP BY」を参照してください。
fieldSubtotalGroupByList API バージョン 18.0 以降で使用できます。クエリ結果をグループ化するために使用される項目を最大 3 つまでカンマで区切って指定します。結果にはグループ化されたデータの小計行が含まれます。「GROUP BY ROLLUP」および「GROUP BY CUBE」を参照してください。
havingConditionExpression API バージョン 18.0 以降で使用できます。クエリに GROUP BY 句が含まれている場合、この条件式では GROUP BY によって返されるレコードが絞り込まれます。「HAVING」を参照してください。
fieldOrderByList クエリ結果を並び替えるために使用される 1 つ以上の項目のカンマ区切りのリストを指定します。たとえば、取引先責任者を照会し、結果を姓、次に名の順に並び替えることができます。
1SELECT Id, LastName, FirstName
2FROM Contact
3ORDER BY LastName, FirstName

SELECT ステートメントの実装のヒント

  • ステートメントの文字数制限デフォルトでは、SOQL ステートメントの長さは 100,000 文字を超えることができません。この最大長を超える SOQL ステートメントでは、API は MALFORMED_QUERY 例外コードを返します。結果の行は返されません。

    多数の数式項目を含むステートメントなど、長くて複雑な SOQL ステートメントでは、QUERY_TOO_COMPLICATED エラーが発生する場合があります。このエラーは、元の SOQL ステートメントが上限の 100,000 文字未満であっても、Salesforce によって処理されるときにステートメントが内部展開されるために発生します。このエラーを避けるには、SOQL ステートメントの複雑さを軽減します。

    Lightning のページレイアウトに 250 個を超える項目が含まれている場合も QUERY_TOO_COMPLICATED エラーが発生することがあります。Lightning ではレコードページレイアウトの項目を取得するために自動生成された SOQL が使用されるため、お客様が記述した SOQL がなくてもこのエラーが発生する場合があります。

    含まれている通貨項目が多すぎる場合にも、文字数の制限に達することがあります。通貨項目では、format メソッドを使用するために SOQL が必要であるため、各通貨項目の API 参照名の長さがおよそ 2 倍になります。

    メモ

  • ステートメントが多数の結果を返す場合 — SELECT 文がレコードごとに大量のデータを返す場合、SOQL によって自動的に結果の数が減らされます。結果の数は、SOQL クエリのコール方法やクエリの複雑さによっても異なります。リストビューを検索すると、リストの最初の 2,000 件のレコードのみが検索されます。オブジェクトに数式項目、派生項目、CLOB 項目、または BLOB 項目が含まれる場合は、大量のデータが返される場合もあります。結果のすべてのページを取得するには、次のいずれかの方法を使用します。
    • SOQL では、SOQL クエリで OFFSET と LIMIT を使用する場合、返されるレコード数が LIMIT よりも少なくなることがあります。返された結果の数を確認し、必要に応じて OFFSET を調整します。OFFSET を LIMIT で増分しないでください。
    • SOAP API では、queryMore() を使用します。
    • REST API では、/query および /queryAll で返される nextRecordsUrl を使用します。
    • Bulk API 2.0 では、ジョブの結果で返される Sforce-Locator 応答ヘッダーを使用します。
  • 結果のローカライズ — SELECT ステートメントには、ローカライズされた項目をサポートする toLabel()convertCurrency()、および FORMAT() 関数を含めることができます。
  • Apex の動的 SOQLApex では、使用しているステートメントで SOQL �� SOSL ステートメントを使うには、角括弧で囲む必要があります。前にコロン (:) がある場合は、Apex スクリプト変数と式を使用できます。
  • 結果の並び替え — クエリで ORDER BY 句を使用しない限り、結果の順序は保証されません。
  • 選択リスト値API バージョン 39.0 以降では、値の API 参照名で選択リスト値を照会するため、実際の値とは異なる可能性があります。
  • クエリタイムアウトの回避WHERE または WITH 句を使用して、クエリ操作時間を短縮することを検討してください。REST API では、クエリ処理に関する情報を得るために、explain パラメーター (ベータ) を試すことも可能です。詳細は、『REST API 開発者ガイド』「クエリのパフォーマンスに関するフィードバックを取得する」を参照してください。