summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMads Jensen <mje@inducks.org>2018-01-14 22:00:16 +0100
committerTim Graham <timograham@gmail.com>2019-01-10 12:10:12 -0500
commit4b9d72210f0201efeafb9703e166aa3b38c04873 (patch)
tree05f193fcbd373c0c6bc22efbbb12b0aa894f8990 /django
parent217f4456d823cdc07b4d8e2721165739e666e1e7 (diff)
Refs #28643 -- Added NullIf database function.
Thanks Nick Pope, Mariusz Felisiak, and Tim Graham for reviews.
Diffstat (limited to 'django')
-rw-r--r--django/db/models/functions/__init__.py4
-rw-r--r--django/db/models/functions/comparison.py13
2 files changed, 14 insertions, 3 deletions
diff --git a/django/db/models/functions/__init__.py b/django/db/models/functions/__init__.py
index f005546eb0..2d58821653 100644
--- a/django/db/models/functions/__init__.py
+++ b/django/db/models/functions/__init__.py
@@ -1,4 +1,4 @@
-from .comparison import Cast, Coalesce, Greatest, Least
+from .comparison import Cast, Coalesce, Greatest, Least, NullIf
from .datetime import (
Extract, ExtractDay, ExtractHour, ExtractIsoYear, ExtractMinute,
ExtractMonth, ExtractQuarter, ExtractSecond, ExtractWeek, ExtractWeekDay,
@@ -20,7 +20,7 @@ from .window import (
__all__ = [
# comparison and conversion
- 'Cast', 'Coalesce', 'Greatest', 'Least',
+ 'Cast', 'Coalesce', 'Greatest', 'Least', 'NullIf',
# datetime
'Extract', 'ExtractDay', 'ExtractHour', 'ExtractMinute', 'ExtractMonth',
'ExtractQuarter', 'ExtractSecond', 'ExtractWeek', 'ExtractWeekDay',
diff --git a/django/db/models/functions/comparison.py b/django/db/models/functions/comparison.py
index ff0f0e09d0..6c0b33bdcc 100644
--- a/django/db/models/functions/comparison.py
+++ b/django/db/models/functions/comparison.py
@@ -1,5 +1,5 @@
"""Database functions that do comparisons or type conversions."""
-from django.db.models.expressions import Func
+from django.db.models.expressions import Func, Value
class Cast(Func):
@@ -103,3 +103,14 @@ class Least(Func):
def as_sqlite(self, compiler, connection, **extra_context):
"""Use the MIN function on SQLite."""
return super().as_sqlite(compiler, connection, function='MIN', **extra_context)
+
+
+class NullIf(Func):
+ function = 'NULLIF'
+ arity = 2
+
+ def as_oracle(self, compiler, connection, **extra_context):
+ expression1 = self.get_source_expressions()[0]
+ if isinstance(expression1, Value) and expression1.value is None:
+ raise ValueError('Oracle does not allow Value(None) for expression1.')
+ return super().as_sql(compiler, connection, **extra_context)