SOQL

####クエリーの発行
```java
xxx__c[] result = Database.query(query);
sObject[] result = [SELECT xxx FROM xxx_c];

if (result.isEmpty()){
    //0件チェック
    ...
}else{
    ...
}

//1件しかデータがない場合は下記の形式も取れるが、データが0件の場合はnullが返るわけではなくQueryExceptionが返ることに注意
xxx__c result = Database.query(query); 
```
####日付の条件1
DAY_IN_YEAR関数を使って年で比較する
` WHERE DAY_IN_YEAR(convertTimezone(StartDateTime)) >= :fromDayOfYear AND DAY_IN_YEAR(convertTimezone(StartDateTime)) <= :toDayOfYear`
####日付の条件2
LAST_N_DAYS関数を使って過去の日付分を取り出す（0:00からxx日前のデータを取得する。本日のデータも含まれる）
`LastPublishedDate = LAST_N_DAYS:5'`
####DateとDatetimeの比較
`DAY_ONLY(datetime__c) =:date`
####日付文字列との比較
`DAY_ONLY(createddate) >= 2017-03-26`
####レコードタイプの取得
Nameは表示ラベル、DeveloperNameはレコードタイプ名として英字で指定したもの
`SELECT RecordTypeId, RecordType.Name, RecordType.DeveloperName FROM xx` 
xx はオブジェクト

上記のDeveloperNameからレコードタイプIDを取得するクエリー
`SELECT DeveloperName, Id, Name FROM RecordType WHERE sObjectType='xxx__c' AND DeveloperName='###'`
####公開グループの取得
Type='Regular'が通常のグループ。ロールに紐付いて作成されるものは'RoleAndSubordinates'がセットされる

```SQL
//公開グループの取得
Group[] groups = [SELECT DeveloperName, Name, Type FROM Group WHERE DeveloperName=:xx];
//グループメンバーの取得 （UserOrGroupIdにユーザーまたはグループのIDがセットされている
SELECT GroupId, Id, UserOrGroupId FROM GroupMember WHERE GroupId=:groups[0].Id
```

####権限セットを持っているかのチェック
```SQL
SELECT AssigneeId, Id FROM PermissionSetAssignment 
WHERE PermissionSetId in
 (SELECT Id FROM PermissionSet WHERE Name = '##権限セット名##')
```

###ロール関連
API名(xx_xx)は DeveloperName項目を使う。

```SQL
//特定のロールに紐付くユーザを取得する。developerNameは英字名
SELECT Id, Name From User WHERE userRoleId in
 (SELECT Id from UserRole WHERE DeveloperName = 'xxxx')

//ユーザーに紐付くロール名を取得する
SELECT Id, userRole.Name, Name FROM User WHERE Id='xxx'
```

#### 添付ファイル（Files)
- 従来からの添付ファイルはサブクエリー（SELECT Id, Name FROM Attachments）を使って取得できるが、Filesに格納されたファイルは ContentDocumentLinkオブジェクトから取得する。
ContentDocumentはファイルを管理する親オブジェクトであり、実際のファイルを取得するには各バージョンを管理する ContentVersion から取得する。
- ファイル本体はContentVersion#VersionDateフィールドにBase64形式で格納されている。
- ContentBodyは内部用なので直接使わない。代わりにContentVersionを使う。

```SQL
//LinkedEntityIdにレコードのIDを指定すると、そのレコードに紐付くファイルの一覧を取得できる
SELECT ContentDocumentId, Id FROM ContentDocumentLink 
 WHERE LinkedEntityId ='a0SN0000004B75W'

//上記で取得できるのはContentDocumentIdなので、実際にダウンロード可能な各バージョンは
 ContentVersionオブジェクトから取得する
SELECT Id, CreatedDate, Title, Description, FileType, Owner.UserName, 
       VersionNumber, ContentDocumentId 
FROM ContentVersion Where IsLatest = true and ContentDocumentId in :cIds order by CreatedDate desc

```

####取引先住所の検索
BillingAddressやShippingAddressという項目はない。
>BillingCountry : 国(請求先) 
BillingPostalCode : 郵便番号(請求先) 
BillingState : 都道府県(請求先) 
BillingCity : 市区郡(請求先) 
BillingStreet : 町名・番地(請求先) 

```SQL
SELECT BillingCountry,BillingPostalCode,BillingState,
       BillingCity,BillingStreet FROM Account
```
####ユーザー住所の検索
Addressではなく、個別に項目を検索する。
>PostalCode : 郵便番号
Country : 国
State : 都道府県
City : 市区郡
Street : 町名・番地

```SQL
SELECT Country, PostalCode, State, City, Street From User
```

####グループ関数を使う
AggregateResultを使う
[参考](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_agg_fns.htm)

```SQL
AggregateResult[] groupedResults
  = [SELECT AVG(Amount)aver FROM Opportunity];
Object avgAmount = groupedResults[0].get('aver');

```