SOQL クエリおよび SOSL クエリでの Apex 変数の使用
Apex の SOQL ステートメントと SOSL ステートメントは、前にコロン (:) がある場合、Apex コード変数と式を参照できます。このように SOQL ステートメントまたは SOSL ステートメント内でローカルコード変数を使用することを、バインドと呼びます。Apex パーサーは、SOQL ステートメントまたは SOSL ステートメントを実行する前に、最初にコードコンテキスト内のローカル変数を評価します。バインド式は、次のように使用できます。
- FIND 句の検索文字列。
- WHERE 句の条件リテラル。
- WHERE 句の IN 演算子または NOT IN 演算子の値。値の動的セットを絞り込むことができます。いずれのデータ型のリストでも機能しますが、特に ID または String のリストで使用されます。
- WITH DIVISION 句のディビジョン名。
- LIMIT 句の数値。
- OFFSET 句の数値。
次に例を示します。
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 INCLUDES clause
19B = [SELECT Id FROM Account WHERE :A.TYPE INCLUDES (‘Customer – Direct; Customer – Channel’)];
20
21// A bind with an expression that is itself a query result
22B = [SELECT Id FROM Account
23 WHERE Name = :[SELECT Name FROM Account
24 WHERE Id = :A.Id].Name];
25
26Contact C = new Contact(LastName='xxx', AccountId=A.Id);
27insert new Contact[]{C, new Contact(LastName='yyy',
28 accountId=A.id)};
29
30// Binds in both the parent and aggregate queries
31B = [SELECT Id, (SELECT Id FROM Contacts
32 WHERE Id = :C.Id)
33 FROM Account
34 WHERE Id = :A.Id];
35
36// One contact returned
37Contact D = B.Contacts;
38
39// A limit bind
40Integer i = 1;
41B = [SELECT Id FROM Account LIMIT :i];
42
43// An OFFSET bind
44Integer offsetVal = 10;
45List<Account> offsetList = [SELECT Id FROM Account OFFSET :offsetVal];
46
47// An IN-bind with an Id list. Note that a list of sObjects
48// can also be used--the Ids of the objects are used for
49// the bind
50Contact[] cc = [SELECT Id FROM Contact LIMIT 2];
51Task[] tt = [SELECT Id FROM Task WHERE WhoId IN :cc];
52
53// An IN-bind with a String list
54String[] ss = new String[]{'a', 'b'};
55Account[] aa = [SELECT Id FROM Account
56 WHERE AccountNumber IN :ss];
57
58// A SOSL query with binds in all possible clauses
59
60String myString1 = 'aaa';
61String myString2 = 'bbb';
62Integer myInt3 = 11;
63String myString4 = 'ccc';
64Integer myInt5 = 22;
65
66List<List<SObject>> searchList = [FIND :myString1 IN ALL FIELDS
67 RETURNING
68 Account (Id, Name WHERE Name LIKE :myString2
69 LIMIT :myInt3),
70 Contact,
71 Opportunity,
72 Lead
73 WITH DIVISION =:myString4
74 LIMIT :myInt5];