{"title":"条件式","version":"5.0","locale":"ja","docname":"ref/models/conditional-expressions","url":"/ja/5.0/ref/models/conditional-expressions/","canonical":"https://djangodocs.dev/ja/5.0/ref/models/conditional-expressions/","summary":"条件式を使用すると、フィルタ、アノテーション、集計、更新の中で if ... elif ... else ロジックを使用できます。条件式はテーブルの各行に対して一連の条件を評価し、マッチした結果式を返します。条件式は他の 式 のように組み合わせたり、入れ子にしたりすることもできます。 条件式クラス Link to this…","html":"<h1>条件式<a class=\"heading-anchor\" href=\"#conditional-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>条件式を使用すると、フィルタ、アノテーション、集計、更新の中で <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">if</span></code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">elif</span></code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">else</span></code></a> ロジックを使用できます。条件式はテーブルの各行に対して一連の条件を評価し、マッチした結果式を返します。条件式は他の <a class=\"reference internal\" href=\"/ja/5.0/ref/models/expressions/\"><span class=\"doc\">式</span></a> のように組み合わせたり、入れ子にしたりすることもできます。</p>\n<section id=\"the-conditional-expression-classes\">\n<h2>条件式クラス<a class=\"heading-anchor\" href=\"#the-conditional-expression-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>このページの例では、以下のモデルを使用します：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Client</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">REGULAR</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;R&quot;</span>\n    <span class=\"n\">GOLD</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;G&quot;</span>\n    <span class=\"n\">PLATINUM</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;P&quot;</span>\n    <span class=\"n\">ACCOUNT_TYPE_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"n\">REGULAR</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Regular&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">GOLD</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Gold&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">PLATINUM</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Platinum&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">registered_on</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">account_type</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n        <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">ACCOUNT_TYPE_CHOICES</span><span class=\"p\">,</span>\n        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"when\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">When</span></code><a class=\"heading-anchor\" href=\"#when\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.When\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">When</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">condition</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">then</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">lookups</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.When\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> オブジェクトは、条件式で使用する条件とその結果をカプセル化するために使用します。<code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> オブジェクトの使用方法は <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a> メソッドの使用方法と似ています。条件は <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">フィルドルックアップ</span></a> や <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span></code></a> オブジェクト、あるいは <a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code></a> である <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code> を持つ <a class=\"reference internal\" href=\"/ja/5.0/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Expression</span></code></a> オブジェクトを使って指定できます。結果は <code class=\"docutils literal notranslate\"><span class=\"pre\">then</span></code> キーワードで指定します。</p>\n<p>例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span><span class=\"p\">,</span> <span class=\"n\">Q</span><span class=\"p\">,</span> <span class=\"n\">When</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># String arguments refer to fields; the following two examples are equivalent:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># You can use field lookups in the condition</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on__gt</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2014</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on__lt</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2015</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Complex conditions can be created using Q objects</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Paul&quot;</span><span class=\"p\">),</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Condition can be created using boolean expressions.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Exists</span><span class=\"p\">,</span> <span class=\"n\">OuterRef</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">non_unique_account_type</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">OuterRef</span><span class=\"p\">(</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">OuterRef</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">Exists</span><span class=\"p\">(</span><span class=\"n\">non_unique_account_type</span><span class=\"p\">),</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;non unique&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Condition can be created using lookup expressions.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.lookups</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">GreaterThan</span><span class=\"p\">,</span> <span class=\"n\">LessThan</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">GreaterThan</span><span class=\"p\">(</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;registered_on&quot;</span><span class=\"p\">),</span> <span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2014</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">&amp;</span> <span class=\"n\">LessThan</span><span class=\"p\">(</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;registered_on&quot;</span><span class=\"p\">),</span> <span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2015</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これらの値はそれぞれ式になることを覚えておいてください。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">then</span></code> キーワード引数は <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> の結果のために予約されているので、 <a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> に <code class=\"docutils literal notranslate\"><span class=\"pre\">then</span></code> という名前のフィールドがある場合、衝突する可能性があります。これは 2 つの方法で解決できます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">then__exact</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"case\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">Case</span></code><a class=\"heading-anchor\" href=\"#case\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.Case\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Case</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">cases</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Case\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Case()</span></code> 式は <code class=\"docutils literal notranslate\"><span class=\"pre\">Python</span></code> の <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">if</span></code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">elif</span></code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">else</span></code></a> 文のようなものです。指定された <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> オブジェクトの各 <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> は 1 つが True と評価されるまで順番に評価されます。一致した <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> オブジェクトの <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> 式が返されます。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span><span class=\"p\">,</span> <span class=\"n\">timedelta</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Case</span><span class=\"p\">,</span> <span class=\"n\">Value</span><span class=\"p\">,</span> <span class=\"n\">When</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Jane Doe&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">36</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;James Smith&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Jack Black&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">10</span> <span class=\"o\">*</span> <span class=\"mi\">365</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get the discount for each Client based on the account type</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">discount</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;5%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;10%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;0%&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;discount&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jane Doe&#39;, &#39;0%&#39;), (&#39;James Smith&#39;, &#39;5%&#39;), (&#39;Jack Black&#39;, &#39;10%&#39;)]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Case()</span></code> は任意の数の <code class=\"docutils literal notranslate\"><span class=\"pre\">When()</span></code> オブジェクトを引数として受け取ることができます。その他のオプションはキーワード引数で指定します。どの条件も <code class=\"docutils literal notranslate\"><span class=\"pre\">TRUE</span></code> と評価されない場合、キーワード引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> で与えられた式が返されます。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 引数が与えられなかった場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> が使用されます。</p>\n<p>先ほどのクエリを修正して、<code class=\"docutils literal notranslate\"><span class=\"pre\">Client</span></code> が私たちとどれくらいの期間、関係があるかに基づいて割引を得るには、ルックアップが使用できます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_month_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_year_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">365</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get the discount for each Client based on the registration date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">discount</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_year_ago</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;10%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_month_ago</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;5%&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"s2\">&quot;0%&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;discount&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jane Doe&#39;, &#39;5%&#39;), (&#39;James Smith&#39;, &#39;0%&#39;), (&#39;Jack Black&#39;, &#39;10%&#39;)]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>条件は順番に評価されるので、上の例では2番目の条件がJane DoeとJack Blackの両方にマッチしても正しい結果が得られることを覚えておいてください。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">Python</span></code> の <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">if</span></code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">elif</span></code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\"><span class=\"pre\">else</span></code></a> 文と同じように動作します。</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">case()</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> 句でも使えます。たとえば、1ヶ月以上前に登録されたゴールドクライアントと1年以上前に登録されたプラチナクライアントを検索する場合：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_month_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_year_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">365</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">a_month_ago</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">a_year_ago</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jack Black&#39;, &#39;P&#39;)]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"advanced-queries\">\n<h2>高度なクエリ<a class=\"heading-anchor\" href=\"#advanced-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>条件式は、アノテーション、集計、フィルタ、ルックアップ、および更新で使用できます。また、他の式と組み合わせたり、入れ子にしたりすることもできます。これにより、強力な条件クエリを作成できます。</p>\n<section id=\"conditional-update\">\n<h3>条件付きの更新<a class=\"heading-anchor\" href=\"#conditional-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>例えば、クライアントの <code class=\"docutils literal notranslate\"><span class=\"pre\">account_type</span></code> を登録日とマッチするように変更したいとします。これを行うには、条件式と <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">update()</span></code></a> メソッドを使います：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_month_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a_year_ago</span> <span class=\"o\">=</span> <span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">365</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Update the account_type for each Client from the registration date</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Case</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_year_ago</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">When</span><span class=\"p\">(</span><span class=\"n\">registered_on__lte</span><span class=\"o\">=</span><span class=\"n\">a_month_ago</span><span class=\"p\">,</span> <span class=\"n\">then</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">Value</span><span class=\"p\">(</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Jane Doe&#39;, &#39;G&#39;), (&#39;James Smith&#39;, &#39;R&#39;), (&#39;Jack Black&#39;, &#39;P&#39;)]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"conditional-aggregation\">\n<span id=\"id1\"></span><h3>条件付きの集計<a class=\"heading-anchor\" href=\"#conditional-aggregation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>それぞれの``account_type``に対応するクライアントの数を知りたい場合はどうすればよいでしょうか？そのためには <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">集計関数</span></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code> 引数を使います：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Create some more Clients first so we can have something to count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Jean Grey&quot;</span><span class=\"p\">,</span> <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">,</span> <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;James Bond&quot;</span><span class=\"p\">,</span> <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Jane Porter&quot;</span><span class=\"p\">,</span> <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">,</span> <span class=\"n\">registered_on</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get counts for each value of account_type</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">regular</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">REGULAR</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">gold</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">GOLD</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">platinum</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"nb\">filter</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">PLATINUM</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;regular&#39;: 2, &#39;gold&#39;: 1, &#39;platinum&#39;: 3}</span>\n</code></pre></div>\n<p>この集計は、SQL 2003の <code class=\"docutils literal notranslate\"><span class=\"pre\">FILTER</span> <span class=\"pre\">WHERE</span></code> 構文をサポートするデータベース上で、クエリを生成します：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"k\">count</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">FILTER</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">regular</span><span class=\"p\">,</span>\n<span class=\"w\">       </span><span class=\"k\">count</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">FILTER</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">gold</span><span class=\"p\">,</span>\n<span class=\"w\">       </span><span class=\"k\">count</span><span class=\"p\">(</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">FILTER</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">platinum</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">clients</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>他のデータベースでは、これは <code class=\"docutils literal notranslate\"><span class=\"pre\">CASE</span></code> ステートメントを使ってエミュレートされます：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"k\">count</span><span class=\"p\">(</span><span class=\"k\">CASE</span><span class=\"w\"> </span><span class=\"k\">WHEN</span><span class=\"w\"> </span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">THEN</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">ELSE</span><span class=\"w\"> </span><span class=\"k\">null</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">regular</span><span class=\"p\">,</span>\n<span class=\"w\">       </span><span class=\"k\">count</span><span class=\"p\">(</span><span class=\"k\">CASE</span><span class=\"w\"> </span><span class=\"k\">WHEN</span><span class=\"w\"> </span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"k\">THEN</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">ELSE</span><span class=\"w\"> </span><span class=\"k\">null</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">gold</span><span class=\"p\">,</span>\n<span class=\"w\">       </span><span class=\"k\">count</span><span class=\"p\">(</span><span class=\"k\">CASE</span><span class=\"w\"> </span><span class=\"k\">WHEN</span><span class=\"w\"> </span><span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"w\"> </span><span class=\"k\">THEN</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">ELSE</span><span class=\"w\"> </span><span class=\"k\">null</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">platinum</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">clients</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>この2つのSQL文は機能的には等価ですが、より明示的な <code class=\"docutils literal notranslate\"><span class=\"pre\">FILTER</span></code> の方がパフォーマンスが良いかもしれません。</p>\n</section>\n<section id=\"conditional-filter\">\n<h3>条件フィルタ<a class=\"heading-anchor\" href=\"#conditional-filter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>条件フィルタ条件式が真偽値を返す場合、それを直接フィルタで使用できます。つまり、 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> カラムには追加されませんが、結果のフィルタリングには使用できます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">non_unique_account_type</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">account_type</span><span class=\"o\">=</span><span class=\"n\">OuterRef</span><span class=\"p\">(</span><span class=\"s2\">&quot;account_type&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">OuterRef</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Client</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">~</span><span class=\"n\">Exists</span><span class=\"p\">(</span><span class=\"n\">non_unique_account_type</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>SQL文では、次のように評価されます:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">client</span><span class=\"w\"> </span><span class=\"n\">c0</span>\n<span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">EXISTS</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">  </span><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"n\">c1</span><span class=\"p\">.</span><span class=\"n\">id</span>\n<span class=\"w\">  </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">client</span><span class=\"w\"> </span><span class=\"n\">c1</span>\n<span class=\"w\">  </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">c1</span><span class=\"p\">.</span><span class=\"n\">account_type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">c0</span><span class=\"p\">.</span><span class=\"n\">account_type</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"n\">c1</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">c0</span><span class=\"p\">.</span><span class=\"n\">id</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>","rootId":"conditional-expressions","toc":[{"title":"条件式クラス","anchor":"the-conditional-expression-classes","children":[{"title":"When","anchor":"when","children":[]},{"title":"Case","anchor":"case","children":[]}]},{"title":"高度なクエリ","anchor":"advanced-queries","children":[{"title":"条件付きの更新","anchor":"conditional-update","children":[]},{"title":"条件付きの集計","anchor":"conditional-aggregation","children":[]},{"title":"条件フィルタ","anchor":"conditional-filter","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.0/ref/"},{"docname":"ref/models/index","title":"モデル","url":"/ja/5.0/ref/models/"}],"prev":{"docname":"ref/models/expressions","title":"クエリ式 (Query Expression)","url":"/ja/5.0/ref/models/expressions/"},"next":{"docname":"ref/models/database-functions","title":"データベース関数","url":"/ja/5.0/ref/models/database-functions/"},"formats":{"html":"/ja/5.0/ref/models/conditional-expressions/","markdown":"/ja/5.0/ref/models/conditional-expressions.md","json":"/ja/5.0/ref/models/conditional-expressions.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/ref/models/conditional-expressions.txt","official":"https://docs.djangoproject.com/ja/5.0/ref/models/conditional-expressions/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}