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

Newer Version Available

This content describes an older version of this product. View Latest

SOQL クエリおよび SOSL クエリでの Apex 変数の使用

Apex の SOQL ステートメントと SOSL ステートメントは、前にコロン (:) がある場合、Apex コード変数と式を参照できます。このように SOQL ステートメントまたは SOSL ステートメント内でローカルコード変数を使用することを、バインドと呼びます。Apex パーサーは、SOQL ステートメントまたは SOSL ステートメントを実行する前に、最初にコードコンテキスト内のローカル変数を評価します。バインド式は、次のように使用できます。

  • FIND 句の検索文字列
  • WHERE 句の条件リテラル
  • WHERE 句の IN 演算子または NOT IN 演算子の値。値の動的セットを絞り込むことができます。いずれのデータ型のリストでも機能しますが、特に ID または String のリストで使用されます。
  • WITH DIVISION 句のディビジョン名
  • LIMIT 句の数値
  • OFFSET 句の数値

バインド式は INCLUDES などの他の句と共に使用することはできません。

次に例を示します。

1Account A = new Account(Name='xxx');
2insert A;
3Account B;
4
5// A simple bind
6B = [SELECT Id FROM Account WHERE Id = :A.Id];
7
8// A bind with arithmetic
9B = [SELECT Id FROM Account 
10     WHERE Name = :('x' + 'xx')];
11
12String s = 'XXX';
13
14// A bind with expressions
15B = [SELECT Id FROM Account 
16     WHERE Name = :'XXXX'.substring(0,3)];
17
18// A bind with an expression that is itself a query result
19B = [SELECT Id FROM Account
20     WHERE Name = :[SELECT Name FROM Account
21                    WHERE Id = :A.Id].Name];
22
23Contact C = new Contact(LastName='xxx', AccountId=A.Id);
24insert new Contact[]{C, new Contact(LastName='yyy', 
25                                    accountId=A.id)};
26
27// Binds in both the parent and aggregate queries
28B = [SELECT Id, (SELECT Id FROM Contacts
29                 WHERE Id = :C.Id)
30     FROM Account
31     WHERE Id = :A.Id];
32
33// One contact returned
34Contact D = B.Contacts;
35
36// A limit bind
37Integer i = 1;
38B = [SELECT Id FROM Account LIMIT :i];
39
40// An OFFSET bind
41Integer offsetVal = 10;
42List<Account> offsetList = [SELECT Id FROM Account OFFSET :offsetVal];
43
44// An IN-bind with an Id list. Note that a list of sObjects
45// can also be used--the Ids of the objects are used for 
46// the bind
47Contact[] cc = [SELECT Id FROM Contact LIMIT 2];
48Task[] tt = [SELECT Id FROM Task WHERE WhoId IN :cc];
49
50// An IN-bind with a String list
51String[] ss = new String[]{'a', 'b'};
52Account[] aa = [SELECT Id FROM Account 
53                WHERE AccountNumber IN :ss];
54
55// A SOSL query with binds in all possible clauses
56
57String myString1 = 'aaa';
58String myString2 = 'bbb';
59Integer myInt3 = 11;
60String myString4 = 'ccc';
61Integer myInt5 = 22;
62
63List<List<SObject>> searchList = [FIND :myString1 IN ALL FIELDS 
64                                  RETURNING 
65                                     Account (Id, Name WHERE Name LIKE :myString2
66                                              LIMIT :myInt3), 
67                                     Contact, 
68                                     Opportunity, 
69                                     Lead 
70                                  WITH DIVISION =:myString4 
71                                  LIMIT :myInt5];
Apex バインド変数は、DISTANCE または GEOLOCATION 関数ではサポートされません。次のクエリは機能しません。 代わりに、次のようなデータベースクエリを使用してください。
1double latitude = 10;
2double longitude = 20;
3double distance = 30;
4List<List<Account>> accountLocations = [SELECT ID, Name, BillingLatitude, BillingLongitude FROM Account where DISTANCE(BillingAddress,GEOLOCATION(:latitude,:longitude),'mi') < :distance];
1Location loc = Location.newInstance(90.0, 90.0);
2List<Account> accountIds = [SELECT Id FROM Account WHERE DISTANCE(BillingAddress, :loc) < 100];
1double latitude = 10;
2double longitude = 20;
3double distance = 30;
4Database.query('SELECT ID, Name, Location__latitude__s,Location __longitude__s FROM Party__c where '+ 'DISTANCE(Location__c,GEOLOCATION('+latitude+','+longitude+' ),\'mi\') < '+distance);

メモ