TYPEOFとは?
SalesforceのTYPEOFとは、オブジェクト種別を確認するために使用する命令です。
TYPEOFは、SalesforceのSOQLクエリのSELECTステートメントにて使用することができ、多態的なリレーションが含まれているオブジェクト種別を確認することができます。
TYPEOFは、APIバージョンの46.0以降または、SOQLのPolymorphism機能の開発者プレビューで使用可能です。
TYPEOFには、多態的なランタイム型に一致する選択項目を指定します。複数の多態的な項目を確認する場合は、一つのSELECTステートメントに複数のTYPEOFを使用します。
サンプルコード
以下は、SalesforceのTYPEOFのサンプルコードです。
TYPEOFは、オブジェクト種別ごとに1つのWHEN句を必要な分だけ指定することができます。ELSE句は、多態的なリレーション項目のオブジェクト種別が、WHEN句で指定したオブジェクト種別と一致しない場合の処理です。ELSE句は省略することも可能です。
SELECT [fieldList,]
[TYPEOF typeOfField
{WHEN whenObjectType THEN whenFieldList}[...]
[ELSE elseFieldList]
END][...]
FROM objectType
TYPEOFの構文
サンプルコードに出てきたSalesforceのTYPEOF固有の構文は、次のものがあります。
1.fieldList
2.typeOfField
3.whenObjectType
4.whenFieldList
5.elseFieldList
6.objectType
fieldList
fieldListには、objectTypeから取得する項目を指定します。
取得する項目が複数ある場合はカンマ区切りのリストで指定します。fieldListは、SELECTステートメントで使用できる標準リストで、多態的なオブジェクト種別に関係なく使用可能です。
もし、多態的なリレーションのオブジェクト項目のみが必要な場合、SELECTステートメントからこのリストを除外することができます。
typeOfField
typeOfFieldには、複数のオブジェクト種別を参照できる多態的なリレーション項目を指定します。
または、objectTypeの親の多態的なリレーション項目を指定することも可能です。例えば、Whoリレーション項目は、ContactかLeadを使用することができます。
whenObjectType
whenObjectTypeには、指定したWHEN句のオブジェクト種別を指定します。
SELECTステートメント実行時、typeOfFieldに指定した多態的なリレーションのオブジェクト種別が、WHEN句のオブジェクト種別と一致するか判定されます。
whenFieldList
whenFieldListには、whenObjectTypeから取得するリストを指定します。
リストは1つ以上の項目をカンマで区切ります。このリストは参照されるオブジェクト種別または、関連オブジェクト項目へのパスです。SELECTステートメントのオブジェクト種別ではありません。
elseFieldList
elseFieldListには、指定した多態的なリレーション項目に一致しない場合のリストを指定します。
リストは1つ以上の項目をカンマで区切ります。このリストは、Nameオブジェクト種別で有効な項目か、Name関連オブジェクトへのパスが含まれる可能性があります。
objectType
objectTypeには、照会するオブジェクト種別を指定します。
照会する対象のオブジェクト種別は、SELECTステートメントでは必ず指定する標準のオブジェクト種別です。
TYPEOFの注意点
SalesforceのTYPEOFを使用する場合、次の注意点があります。
1.namePointing属性がfalseになっているリレーションでは使用することができません。
2.relationshipName属性がfalseになっているリレーションでは使用することができません。
3.クエリのSELECT句のみ使用することができます。
4.オブジェクトを返さないクエリで使用することはできません。例えば、COUNTなどの集計クエリです。
5.ストリーミングAPI PushTopicベースのSOQLクエリで使用することはできません。
6.Bulk APIのSOQLクエリで使用することはできません。
7.ネストができません。つまり、TYPEOFのWHEN句の中で別のTYPEOFは使用できません。
8.準結合クエリのSELECT句では使用することはできません。
準結合クエリのサンプルコード
準結合クエリのSELECT句のサンプルコードです。
この場合、TYPEOFは無効になります。
SELECT Name FROM Account
WHERE CreatedById IN
(
SELECT
TYPEOF Owner
WHEN User THEN Id
WHEN Group THEN CreatedById
END
FROM CASE
)
ただし、以下のサンプルコードのように外側のSELECT句でTYPEOFが使用されている場合は、TYPEOFは有効になります。
SELECT
TYPEOF What
WHEN Account THEN Phone
ELSE Name
END
FROM Event
WHERE CreatedById IN
(
SELECT CreatedById
FROM Case
)
関数を含むクエリのサンプルコード
SalesforceのTYPEOFは、SELECT句で関数を含むクエリでは使用することができません。
以下のサンプルコードは、TYPEOFの中にFORMAT関数が含まれているので、TYPEOFは無効になります。
SELECT
TYPEOF What
WHEN Account THEN Id, FORMAT(LastModifiedDate) LastModifiedDate__f
WHEN Oppty THEN Id
END
FROM Task
ただし、以下のように2つの処理に分ければ、TYPEOFを有効にできます。まず、FORMAT関数を使用せずにIDのリストを取得します。
SELECT
TYPEOF What
WHEN Account THEN Id, LastModifiedDate
WHEN Opportunity THEN Id
END
FROM Task
次に、IDリストに対してFORMAT関数を使用します。
SELECT
FORMAT(LastModifiedDate) LastModifiedDate__f
FROM Account
WHERE Id in RetrievedIdList
TYPEOFの応用
多態的なリレーションのオブジェクト種別に応じて、処理を分けるサンプルコードです。
このSELECTステートメントでは、What項目で参照するオブジェクト種別によって処理を分岐しています。オブジェクト種別がAccountの場合は、Phone項目とNumberOfEmployees項目を返し、オブジェクト種別がOpportunityの場合は、Amount項目とCloseDate項目を返します。
ELSE句が無いので、オブジェクト種別がAccountでもOpportunityでもない場合、nullを返します。
SELECT
TYPEOF What
WHEN Account THEN Phone, NumberOfEmployees
WHEN Opportunity THEN Amount, CloseDate
ELSE Name, Email
END
FROM Event
SalesforceのTYPEOFを活用しよう!
今回は、SalesforceのTYPEOFについて、概要と使い方を説明しました。
TYPEOFは、多態的なリレーションのオブジェクト種別を確認する場合に使用する命令です。オブジェクト種別ごとに処理を分けたり、指定したオブジェクト種別に当てはまらない場合の処理を追加したりすることが可能です。
ぜひこの機会に使用できるように理解しておきましょう。]]>