Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions force-app/main/default/classes/standard-soql/SOQL.cls
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ public virtual inherited sharing class SOQL implements Queryable {
Filter isTrue();
Filter isFalse();
Filter equal(Object value);
Filter equalNullSafe(Object value);
Filter notEqual(Object value);
Filter lessThan(Object value);
Filter lessOrEqual(Object value);
Expand Down Expand Up @@ -348,6 +349,7 @@ public virtual inherited sharing class SOQL implements Queryable {
HavingFilter isTrue();
HavingFilter isFalse();
HavingFilter equal(Object value);
HavingFilter equalNullSafe(Object value);
HavingFilter notEqual(Object value);
HavingFilter lessThan(Object value);
HavingFilter lessOrEqual(Object value);
Expand Down Expand Up @@ -2063,6 +2065,13 @@ public virtual inherited sharing class SOQL implements Queryable {
return this.set('=', value);
}

public Filter equalNullSafe(Object value) {
if(value == null) {
return this.isNotNull();
}
return this.equal(value);
}

public Filter notEqual(Object value) {
return this.set('!=', value);
}
Expand Down Expand Up @@ -2536,6 +2545,13 @@ public virtual inherited sharing class SOQL implements Queryable {
return this.set('=', value);
}

public HavingFilter equalNullSafe(Object value) {
if(value == null) {
return this.isNotNull();
}
return this.equal(value);
}

public HavingFilter notEqual(Object value) {
return this.set('!=', value);
}
Expand Down
25 changes: 25 additions & 0 deletions website/docs/soql/api/soql-filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ The following are methods for `Filter`.
- [`isTrue()`](#istrue)
- [`isFalse()`](#isfalse)
- [`equal(Object value)`](#equal)
- [`equalNullSafe(Object value)`](#equalnullsafe)
- [`notEqual(Object value)`](#notequal)
- [`lessThan(Object value)`](#lessthan)
- [`greaterThan(Object value)`](#greaterthan)
Expand Down Expand Up @@ -334,6 +335,30 @@ SOQL.of(Account.SObjectType)
.toList();
```

### equalNullSafe

Safely call equals with a variable that can be null. Ensuring WHERE Field = null does not occur returning unrelated records.

- `WHERE (Name = 'My Account' AND Name != NULL)`

**Signature**

```apex
Filter equalNullSafe(Object value)
```

**Example**

```sql
SELECT Id FROM Account WHERE (Name = 'My Account' AND Name != NULL)
```

```apex
SOQL.of(Contact.SObjectType)
.whereAre(SOQL.Filter.name().equalNullSafe(variable))
.toList();
```

### notEqual

- `WHERE Name != 'My Account'`
Expand Down
29 changes: 29 additions & 0 deletions website/docs/soql/api/soql-having-filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ The following are methods for `HavingFilter`.
- [`isTrue()`](#istrue)
- [`isFalse()`](#isfalse)
- [`equal(Object value)`](#equal)
- [`equalNullSafe(Object value)`](#equalnullsafe)
- [`notEqual(Object value)`](#notequal)
- [`lessThan(Object value)`](#lessthan)
- [`greaterThan(Object value)`](#greaterthan)
Expand Down Expand Up @@ -380,6 +381,34 @@ SOQL.of(Lead.SObjectType)
.toAggregated();
```

### equalNullSafe

- `HAVING (City = 'Los Angeles' AND City != NULL)`
- `HAVING SUM(AnnualRevenue) = 100000`

**Signature**

```apex
HavingFilter equalNullSafe(Object value)
```

**Example**

```sql
SELECT COUNT(Name)
FROM Lead
GROUP BY LeadSource
HAVING (LeadSource = 'Web' AND LeadSource != NULL)
```

```apex
SOQL.of(Lead.SObjectType)
.count(Lead.Name)
.groupBy(Lead.LeadSource)
.have(SOQL.HavingFilter.with(Lead.LeadSource).equalNullSafe('Web'))
.toAggregated();
```

### notEqual

- `HAVING City != 'Los Angeles'`
Expand Down
Loading