Salesforceではデータの取得でSOQLを使います。
一般的なRDBのSQLと似ていますが、結合処理や、検索の指定がSQLと異なります。
検索条件でのnullの指定と検索結果について、SOQLとSQLの違いがあるのでメモです。
次のデータをサンプルとしてSOQLとSQLで検索結果の違いを見ていこうと思います。
# | 項目 | 備考 |
1 | valueA | |
2 | valueB | |
3 | null値です。 | |
4 | valueC |
nullの条件の指定
SOQLのnullの条件は、 「項目 = null」 または 「項目 = ''」 です。
Salesforceには空文字でデータ登録はできないのでSOQLでは、nullと空文字で区別はありません。
※Apexではnullと空文字は異なります。
「項目 = null」の条件に対して結果は次です。
# | 項目 | 備考 |
3 | null値です。 |
SQLのnullの条件は「項目 is null」です。この条件での結果は次です。
# | 項目 | 備考 |
3 | null値です。 |
in句でのnullの条件の指定
SOQLで、in句でnullを指定可能です。 逆にin内でnullが入っていると検索結果に含まれてしまいます。
「項目 in ('valueA',null,'ValueC')」の条件に対して結果は次です。
# | 項目 | 備考 |
1 | valueA | |
3 | null値です。 | |
4 | valueC |
SQLで、in句にnullを指定しても結果には含まれません。
「項目 in ('valueA',null,'ValueC')」の条件に対して結果は次です。
# | 項目 | 備考 |
1 | valueA | |
4 | valueC |
XX以外の条件でnullの扱い
SOQLでは、例えば 「項目 != 'valueA'」のように、XX以外を指定した場合、
指定された項目がnullの値は検索結果に含まれます。
「項目 != 'valueA'」の条件に対して結果は次です。
# | 項目 | 備考 |
2 | valueB | |
3 | null値です。 | |
4 | valueC |
SOQLでは、例えば 「項目 != 'valueA'」のように、XX以外を指定した場合、
指定された項目がnullの値は検索結果に含まれません。
「項目 != 'valueA'」の条件に対して結果は次です。
# | 項目 | 備考 |
2 | valueB | |
4 | valueC |
最後に
プログラムで、nullの結果が含まれる、含まれないで動きがだいぶ違うため
扱いに注意が必要です。私はSQLに慣れ過ぎていて、Salesforceの動きで大分戸惑いましたが。。