doc-exports/docs/dws/dev/dws_06_0049.html
Lu, Huayi a24ca60074 DWS DEVELOPER 811 version
Reviewed-by: Hasko, Vladimir <vladimir.hasko@t-systems.com>
Co-authored-by: Lu, Huayi <luhuayi@huawei.com>
Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
2023-01-19 13:37:49 +00:00

179 lines
21 KiB
HTML

<a name="EN-US_TOPIC_0000001098830688"></a><a name="EN-US_TOPIC_0000001098830688"></a>
<h1 class="topictitle1">Set Returning Functions</h1>
<div id="body8662426"><div class="section" id="EN-US_TOPIC_0000001098830688__s46121aaed94c4fde864ba070d014e4d8"><h4 class="sectiontitle">Series Generating Functions</h4><ul id="EN-US_TOPIC_0000001098830688__uaa69a700335443f7a581d7e821d13cea"><li id="EN-US_TOPIC_0000001098830688__l2f23ab2afc5248e480e8c768fddc7523">generate_series(start, stop)<p id="EN-US_TOPIC_0000001098830688__a83a9fa6a170d45d5b728b294053339f4"><a name="EN-US_TOPIC_0000001098830688__l2f23ab2afc5248e480e8c768fddc7523"></a><a name="l2f23ab2afc5248e480e8c768fddc7523"></a>Description: Generates a series of values, from <strong id="EN-US_TOPIC_0000001098830688__b842352706142834">start</strong> to <strong id="EN-US_TOPIC_0000001098830688__b842352706142835">stop</strong> with a step size of one.</p>
<p id="EN-US_TOPIC_0000001098830688__ab1141d48fdc34de5b9c00929869b57f8">Parameter type: int, bigint, or numeric</p>
<p id="EN-US_TOPIC_0000001098830688__ab7778a10ae3f4a6baf2334eda86691d2">Return type: setof int, setof bigint, or setof numeric (same as the argument type)</p>
</li><li id="EN-US_TOPIC_0000001098830688__l6abf9bfc78b6407abfeb1fd3254f6050">generate_series(start, stop, step)<p id="EN-US_TOPIC_0000001098830688__a2a42be1cd2c64d809e98b8b31f44c5fb"><a name="EN-US_TOPIC_0000001098830688__l6abf9bfc78b6407abfeb1fd3254f6050"></a><a name="l6abf9bfc78b6407abfeb1fd3254f6050"></a>Description: Generates a series of values, from <strong id="EN-US_TOPIC_0000001098830688__b842352706142937">start</strong> to <strong id="EN-US_TOPIC_0000001098830688__b842352706142938">stop</strong> with a step size of <strong id="EN-US_TOPIC_0000001098830688__b842352706142936">step</strong>.</p>
<p id="EN-US_TOPIC_0000001098830688__a9aefad53d9a4481aafb3efee79cbbf28">Parameter type: int, bigint, or numeric</p>
<p id="EN-US_TOPIC_0000001098830688__ab901125090944a59a85877779a77e873">Return type: setof int, setof bigint, or setof numeric (same as the argument type)</p>
</li><li id="EN-US_TOPIC_0000001098830688__l21c99baeaea14bd58bafb8f65b9010a3">generate_series(start, stop, step interval)<p id="EN-US_TOPIC_0000001098830688__ac4448815b347477f9d4650d74fa007f7"><a name="EN-US_TOPIC_0000001098830688__l21c99baeaea14bd58bafb8f65b9010a3"></a><a name="l21c99baeaea14bd58bafb8f65b9010a3"></a>Description: Generates a series of values, from <strong id="EN-US_TOPIC_0000001098830688__b842352706142937_1">start</strong> to <strong id="EN-US_TOPIC_0000001098830688__b842352706142938_1">stop</strong> with a step size of <strong id="EN-US_TOPIC_0000001098830688__b842352706142936_1">step</strong>.</p>
<p id="EN-US_TOPIC_0000001098830688__aa62cbf1142b94cde8165730be87d364a">Parameter type: timestamp or timestamp with time zone</p>
<p id="EN-US_TOPIC_0000001098830688__a07ac2275650b47598f357f3441d46c84">Return type: setof timestamp or setof timestamp with time zone (same as argument type)</p>
</li></ul>
</div>
<p id="EN-US_TOPIC_0000001098830688__ad2b89768a2734b7b85c69078f7a83eb0">When <strong id="EN-US_TOPIC_0000001098830688__b84235270617355">step</strong> is positive, zero rows are returned if <strong id="EN-US_TOPIC_0000001098830688__b8423527061740">start</strong> is greater than <strong id="EN-US_TOPIC_0000001098830688__b8423527061746">stop</strong>. Conversely, when <strong id="EN-US_TOPIC_0000001098830688__b84235270617410">step</strong> is negative, zero rows are returned if <strong id="EN-US_TOPIC_0000001098830688__b84235270617415">start</strong> is less than <strong id="EN-US_TOPIC_0000001098830688__b84235270617418">stop</strong>. Zero rows are also returned for <strong id="EN-US_TOPIC_0000001098830688__b84235270617450">NULL</strong> inputs. It is an error for <strong id="EN-US_TOPIC_0000001098830688__b842352706143045">step</strong> to be zero.</p>
<p id="EN-US_TOPIC_0000001098830688__a1babbdf2255c436d8b0c9aab51a40e83">For example:</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098830688__sdafd64981f89402cae8f46e0622115da"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">generate_series</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">generate_series</span><span class="w"></span>
<span class="c1">-----------------</span>
<span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="w"> </span><span class="mi">3</span><span class="w"></span>
<span class="w"> </span><span class="mi">4</span><span class="w"></span>
<span class="p">(</span><span class="mi">3</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">generate_series</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">generate_series</span><span class="w"></span>
<span class="c1">-----------------</span>
<span class="w"> </span><span class="mi">5</span><span class="w"></span>
<span class="w"> </span><span class="mi">3</span><span class="w"></span>
<span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="p">(</span><span class="mi">3</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">generate_series</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">generate_series</span><span class="w"></span>
<span class="c1">-----------------</span>
<span class="p">(</span><span class="mi">0</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
<span class="c1">-- this example relies on the date-plus-integer operator</span>
<span class="k">SELECT</span><span class="w"> </span><span class="k">current_date</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">a</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">dates</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">generate_series</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">14</span><span class="p">,</span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">s</span><span class="p">(</span><span class="n">a</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">dates</span><span class="w"></span>
<span class="c1">------------</span>
<span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">02</span><span class="w"></span>
<span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">09</span><span class="w"></span>
<span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">16</span><span class="w"></span>
<span class="p">(</span><span class="mi">3</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">generate_series</span><span class="p">(</span><span class="s1">'2008-03-01 00:00'</span><span class="p">::</span><span class="k">timestamp</span><span class="p">,</span><span class="w"> </span><span class="s1">'2008-03-04 12:00'</span><span class="p">,</span><span class="w"> </span><span class="s1">'10 hours'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">generate_series</span><span class="w"> </span>
<span class="c1">---------------------</span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">01</span><span class="w"> </span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">01</span><span class="w"> </span><span class="mi">10</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">01</span><span class="w"> </span><span class="mi">20</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">02</span><span class="w"> </span><span class="mi">06</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">02</span><span class="w"> </span><span class="mi">16</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">03</span><span class="w"> </span><span class="mi">02</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">03</span><span class="w"> </span><span class="mi">12</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">03</span><span class="w"> </span><span class="mi">22</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="w"> </span><span class="mi">2008</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">04</span><span class="w"> </span><span class="mi">08</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w"></span>
<span class="p">(</span><span class="mi">9</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
<div class="section" id="EN-US_TOPIC_0000001098830688__s2c7ad230ed29408a87f6f2a0a843271c"><h4 class="sectiontitle">Subscript Generating Functions</h4><ul id="EN-US_TOPIC_0000001098830688__u13c4ad193e5340108dd18fba7152ab83"><li id="EN-US_TOPIC_0000001098830688__l034e6bb55d34410fb3c8b00defc6d212">generate_subscripts(array anyarray, dim int)<p id="EN-US_TOPIC_0000001098830688__a476f34c3cdc44811a26ff55c37666e0d"><a name="EN-US_TOPIC_0000001098830688__l034e6bb55d34410fb3c8b00defc6d212"></a><a name="l034e6bb55d34410fb3c8b00defc6d212"></a>Description: Generates a series comprising the given array's subscripts.</p>
<p id="EN-US_TOPIC_0000001098830688__a9d11b842912445599a5a166e6b13adfc">Return type: setof int</p>
</li><li id="EN-US_TOPIC_0000001098830688__l8dc0a7e3ae074513b165a105e6cd12e2">generate_subscripts(array anyarray, dim int, reverse boolean)<p id="EN-US_TOPIC_0000001098830688__a2a39022dda0d4506bd756a5438ad5088"><a name="EN-US_TOPIC_0000001098830688__l8dc0a7e3ae074513b165a105e6cd12e2"></a><a name="l8dc0a7e3ae074513b165a105e6cd12e2"></a>Description: Generates a series comprising the given array's subscripts. When <strong id="EN-US_TOPIC_0000001098830688__b842352706171449">reverse</strong> is true, the series is returned in reverse order.</p>
<p id="EN-US_TOPIC_0000001098830688__a6b12e0b5ba5043768a5174d6abed82ec">Return type: setof int</p>
</li></ul>
</div>
<p id="EN-US_TOPIC_0000001098830688__a1c47fe4a3e4047dc8a54453d9e11ebab"><strong id="EN-US_TOPIC_0000001098830688__b842352706171716">generate_subscripts</strong> is a function that generates the set of valid subscripts for the specified dimension of the given array. Zero rows are returned for arrays that do not have the requested dimension, or for NULL arrays (but valid subscripts are returned for NULL array elements). For example:</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098830688__s1a603b29840742fe9dbbf7e2e714ad07"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span>
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1">-- basic usage</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">generate_subscripts</span><span class="p">(</span><span class="s1">'{NULL,1,NULL,2}'</span><span class="p">::</span><span class="nb">int</span><span class="p">[],</span><span class="w"> </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">s</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">s</span><span class="w"> </span>
<span class="c1">---</span>
<span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="w"> </span><span class="mi">3</span><span class="w"></span>
<span class="w"> </span><span class="mi">4</span><span class="w"></span>
<span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098830688__s076ea5a2f253496b93be38c59abe118d"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span></pre></div></td><td class="code"><div><pre><span></span><span class="c1">-- unnest a 2D array</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">unnest2</span><span class="p">(</span><span class="n">anyarray</span><span class="p">)</span><span class="w"></span>
<span class="k">RETURNS</span><span class="w"> </span><span class="k">SETOF</span><span class="w"> </span><span class="n">anyelement</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="err">$$</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="err">$</span><span class="mi">1</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span><span class="w"></span>
<span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">generate_subscripts</span><span class="p">(</span><span class="err">$</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="n">g1</span><span class="p">(</span><span class="n">i</span><span class="p">),</span><span class="w"></span>
<span class="w"> </span><span class="n">generate_subscripts</span><span class="p">(</span><span class="err">$</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="n">g2</span><span class="p">(</span><span class="n">j</span><span class="p">);</span><span class="w"></span>
<span class="err">$$</span><span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">sql</span><span class="w"> </span><span class="k">IMMUTABLE</span><span class="p">;</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">unnest2</span><span class="p">(</span><span class="nb">ARRAY</span><span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]]);</span><span class="w"></span>
<span class="w"> </span><span class="n">unnest2</span><span class="w"> </span>
<span class="c1">---------</span>
<span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="w"> </span><span class="mi">3</span><span class="w"></span>
<span class="w"> </span><span class="mi">4</span><span class="w"></span>
<span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w"></span>
<span class="c1">-- Delete the function:</span>
<span class="k">DROP</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">unnest2</span><span class="p">;</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0027.html">Functions and Operators</a></div>
</div>
</div>