【Salesforce】SOQLについてのメモ①

とある記事が消されそうなのでメモ( ;∀;)

# SOQLとは
SOQL = Salesforce Object Query Language
→Salesforceデータから特定の情報を検索できる
：オブジェクトから特定のレコードを取得ができる。

メモ：SELECT構文を使う。

[SOQL DOC](https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm)

# （SELECT）構文と句

:::note info
基本構造
**SELECT** *Field Name* 
**FROM** *Object Name(**REQUIRED**)* 
**WHERE** *Expression* 
**GROUP BY** *Field Name*
**LIMIT** *ROW LIM(行数)*
:::
※WHERE／GROUPBY／LIMIT　は省略可能

# 使用例
### ①子OBJから親OBJの項目を参照する

:::note info
標準項目→　*Field Name.親OBJのFieldName*
カスOBJ→　*Field Name* **__r**.親OBJの*Field Name***
:::

##### 取引先責任者→取引先　の参照

```ruby:記述例
SELECT Name(取引先責任者の名前項目), 
Account.Name（取引先の名前項目） 
from Contact（最初に宣言した項目のOBJ名）
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/1762b6bf-e8fa-42f8-fd58-4a88190251d1.png)


###### 商談から取引先の参照

```ruby:記述例
SELECT Name(取引先責任者の名前項目), 
Account.Name（取引先の名前項目） 
from Opportunity（最初に宣言した項目のOBJ名）
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/ef394e78-576d-bc10-f990-a06e32c7cefa.png)


### ②親OBJから子OBJへの参照

サブクエリ部分を（）で括り、リレーションを指定する。

##### 取引先から取引先責任者への参照

```ruby:記述例
SELECT Name(取引先の項目名),
  (
    SELECT FirstName（取引先責任者の項目名）
    FROM Contacts（取引先責任者のOBJ名※下記引用参照）
  )
FROM Account　最初に宣言した項目のOBJ名）
```
>サブクエリ内の FROM 句の初期のメンバーが外部クエリ FROM 句の初期のメンバーの場合、サブクエリ (括弧で囲まれた) を使用して、これらのリレーションを指定してください。標準オブジェクトのサブクエリでは、オブジェクトの複数形の名前が各オブジェクトのリレーション名であるため、複数形の名前を指定する必要があります。
[引用元](https://developer.salesforce.com/docs/atlas.ja-jp.234.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_query_using.htm)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/3902add6-581e-0610-07c6-d5931040d38a.png)

# 条件文（Expression）の構文
#### WHERE句
↪項目を指定することで、検索条件のように使用できる

:::note info
①完全一致　（＝）
②一致しない　（！＝）
③あいまい　（LIKE）
④どれかに等しい （IN）
⑤どれにも一致しない　(NOT IN)
:::

**①完全一致**
✓取引先の（カスタム）項目が「１」の取引先の取引先名と（カスタム）項目値を取得する

```ruby:記述例
SELECT Name,test001__c 
FROM Account 
WHERE test001__c = '1'
```
::: note info
「＝」を使用する
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/d77b2d99-41f4-5094-8f90-6de98d5c7780.png)

**②一致しない**
✓取引先の（カスタム）項目が「NULL値でない」取引先の取引先名と（カスタム）項目値を取得する

```ruby:記述例
SELECT Name,test001__c 
FROM Account 
WHERE test001__c != NULL
```
:::note info
「!=」を使用する
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/89164b01-dc75-1111-b657-3956bbce62df.png)

**③あいまい**
✓取引先の取引先名が「株式会社××」の取引先名を取得する

```ruby:記述例
SELECT Name 
FROM Account 
WHERE Name LIKE '株式会社%'
```
:::note info
・「LIKE」を使用する
・LIKEでは「％」「＿」がワイルドカードが使用できる
・％→０個以上の文字／＿　→　１文字のみ
※ロングテキストエリアは使用不可
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/0de93474-053c-5e18-304e-f4d0140fc4e8.png)

**④どれかに等しい**
✓取引先の（カスタム）項目が「１」または「２」の取引先の取引先名と（カスタム）項目値を取得する

```ruby:記述例
SELECT Name,test001__c 
FROM Account 
WHERE test001__c IN ('1', '2')
```

:::note info
IN ('文字列','文字列'...)　で括る。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/fae4d97a-d061-dcdc-3d1f-44d1ff78a374.png)

**⑤どれにも一致しない**
✓取引先の（カスタム）項目が「１」または「２」または「NULL」でないの取引先の取引先名と（カスタム）項目値を取得する

```ruby:記述例
SELECT Name,test001__c 
FROM Account 
WHERE test001__c NOT IN ('1', '2',NULL)
```

:::note info
・NOT IN ('文字列','文字列'...)　で括る。
・NULL値はシングルコーテーション不要
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/aa6e569a-900b-75fe-f49a-319fee61886e.png)

[比較演算子](https://developer.salesforce.com/docs/atlas.ja-jp.234.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_comparisonoperators.htm)

# 不等号について

:::note info
・数値や日付の検索で使用
・範囲での検索は **「AND」、「OR」、「NOT」** が使用可能
・日付項目、日付／時間項目の書き方は **「-」** 
・日本時間に合わせる場合は「+0900」または9時間マイナスした値（Zulu）を使用
:::

✓取引先の最終更新日が2025/01/01～2025/01/31までの取引先の取引先名と最終更新日を取得する

↓上記の条件で作成したレポート↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/512cccc1-52f4-d8ba-d23d-d66fc136d44c.png)

```ruby:記述例
SELECT Name, LastModifiedDate 
FROM Account 
WHERE LastModifiedDate >= 2025-01-01T00:00:00+0900 
AND LastModifiedDate <= 2025-01-31T00:00:00+0900
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/3dcbde83-1dcc-8845-9d8a-d65e23ba1725.png)

## 相対日付（上記の日付に付随して）
相対日付も使用できる。
(yesterday,Today,Last_30_days etc...)

✓商談の作成日が今日の商談の商談名
と作成日を取得

```ruby:記述例
SELECT Name, CreatedDate 
FROM Opportunity 
WHERE CreatedDate = today 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987133/fad1420c-e272-3f5c-0019-93478fa50742.png)


[日付リテラル値他](https://developer.salesforce.com/docs/atlas.ja-jp.234.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm)

****

並び替えと計算などはまた別途メモに～～( ﾟДﾟ)