- SOQLでFIELDS()関数を使って簡単に全項目を取得する方法
- FIELDS()関数の制限事項
SalesforceのSOQLではSQLのように「*(アスタリスク)」を記述して全項目を取得するような便利な書き方ができません。
ですが、すべての項目名を列挙しなくても全項目を取得する方法はあります。
そこで当記事では、SOQLで項目名をすべて列挙せずに全項目を取得する方法について紹介していきます。
SQLユーザには普通の事なのかもしれませんが、リリースされたときは革新的だと思った機能です!
FIELDS()関数を使用する
SOQLには様々な関数が用意されていますが、「FIELDS()」関数はSpring’21でリリースされた比較的新しめの機能です。
FIELDS()関数を使用すれば、SQLの「*(アスタリスク)」に近い感覚で全項目を取得することができます。
FIELDS()関数の使い方
FIELDS()関数は次のように記述して使用します。
SELECT FIELDS(ALL) FROM Account limit 200
FIELDS()関数のバリエーション
FIELDS()関数のバリエーションは下記の3通りです。
種別 | 詳細 |
---|---|
FIELDS(ALL) | 対象オブジェクトの全項目を取得 |
FIELDS(CUSTOM) | 対象オブジェクトのカスタム項目をすべて取得 |
FIELDS(STANDARD) | 対象オブジェクトの標準項目をすべて取得 |
FIELDS()関数の制限事項
便利なFIELDS()関数ですが、制限事項がいくつかあります。
FIELDS(ALL)とFIELDS(CUSTOM)を使用する場合は、「LIMIT 200」をつけないとエラーでクエリを実行できません。
ただ、厳密には200レコード以下に絞り込めるクエリになっていれば問題ないので、LIMITを200より小さくしたり、次のように取得件数が選択的なクエリになっていれば実行は可能のようです。
SELECT FIELDS(ALL) FROM Account WHERE Id = '0011000001KSEU2AAP'
FIELDS()関数は項目レベルセキュリティが適用されるため、実行ユーザにアクセス権のある項目しか取得されません。
ApexトリガやApexコントローラなど、システム権限以外で動作する可能性のある処理で使用する場合は注意が必要です。
次のような書き方は取得する項目に重複が発生するためエラーとなります。
SELECT Id, FIELDS(ALL) FROM Account limit 200
FIELDS(ALL)でもIdを取得してしまうため、重複になってしまいます。
重複さえ発生しなければ良いので、次のような書き方はOKです。
SELECT Id, FIELDS(CUSTOM) FROM Account limit 200
ID以外の標準項目が不要な場合はALLを使用するよりも上記の書き方の方が良いかもしれないですね。
まとめ
Apexクラスに項目名を直接記述していると、項目を削除する場合にいちいちApexクラスの修正が必要になるので面倒だったりするので、FIELDS()関数の登場でかなり便利になったかと思います。
制限事項は注意が必要ですが、使えそうな場面では積極的に利用してみてはいかがでしょうか。