An SQL searched CASE expression: CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' END
| 1715 | |
| 1716 | @deconstructible(path="django.db.models.Case") |
| 1717 | class Case(SQLiteNumericMixin, Expression): |
| 1718 | """ |
| 1719 | An SQL searched CASE expression: |
| 1720 | |
| 1721 | CASE |
| 1722 | WHEN n > 0 |
| 1723 | THEN 'positive' |
| 1724 | WHEN n < 0 |
| 1725 | THEN 'negative' |
| 1726 | ELSE 'zero' |
| 1727 | END |
| 1728 | """ |
| 1729 | |
| 1730 | template = "CASE %(cases)s ELSE %(default)s END" |
| 1731 | case_joiner = " " |
| 1732 | |
| 1733 | def __init__(self, *cases, default=None, output_field=None, **extra): |
| 1734 | if not all(isinstance(case, When) for case in cases): |
| 1735 | raise TypeError("Positional arguments must all be When objects.") |
| 1736 | super().__init__(output_field) |
| 1737 | self.cases = list(cases) |
| 1738 | self.default = self._parse_expressions(default)[0] |
| 1739 | self.extra = extra |
| 1740 | |
| 1741 | def __str__(self): |
| 1742 | return "CASE %s, ELSE %r" % ( |
| 1743 | ", ".join(str(c) for c in self.cases), |
| 1744 | self.default, |
| 1745 | ) |
| 1746 | |
| 1747 | def __repr__(self): |
| 1748 | return "<%s: %s>" % (self.__class__.__name__, self) |
| 1749 | |
| 1750 | def get_source_expressions(self): |
| 1751 | return [*self.cases, self.default] |
| 1752 | |
| 1753 | def set_source_expressions(self, exprs): |
| 1754 | *self.cases, self.default = exprs |
| 1755 | |
| 1756 | def copy(self): |
| 1757 | c = super().copy() |
| 1758 | c.cases = c.cases[:] |
| 1759 | return c |
| 1760 | |
| 1761 | def as_sql( |
| 1762 | self, compiler, connection, template=None, case_joiner=None, **extra_context |
| 1763 | ): |
| 1764 | connection.ops.check_expression_support(self) |
| 1765 | if not self.cases: |
| 1766 | return compiler.compile(self.default) |
| 1767 | template_params = {**self.extra, **extra_context} |
| 1768 | case_parts = [] |
| 1769 | sql_params = [] |
| 1770 | for case in self.cases: |
| 1771 | try: |
| 1772 | case_sql, case_params = compiler.compile(case) |
| 1773 | except EmptyResultSet: |
| 1774 | continue |
no outgoing calls