sql как сделать нулевые значения последними при сортировке по возрастанию

<p>у меня есть таблица sql с полем datetime. поле, о котором идет речь, может быть нулевым. у меня есть запрос, и я хочу, чтобы результаты сортировались по возрастанию по полю даты и времени, однако я хочу строки, в которых поле даты и времени равно нулю в конце списка, а не в начале.</p><p>есть ли простой способ сделать это?</p>

<pre><code>select mydate from mytable order by case when mydate is null then 1 else 0 end, mydate </code></pre>

<p>("немного" поздно, но об этом вообще не упоминалось)</p><p>вы не указали свою субд.</p><p>в стандартном sql (и в большинстве современных субд, таких как oracle, postgresql, db2, firebird, apache derby, hsqldb и h2) вы можете указать <code>nulls last</code> или <code>nulls first</code>:</p><p>используйте <code>nulls last</code>, чтобы отсортировать их до конца:</p><pre><code>select * from some\_table order by some\_column desc nulls last </code></pre>

<p>я также наткнулся на это, и следующее, кажется, помогает мне в mysql и postgresql:</p><pre><code>order by date is null, date desc </code></pre><p>как найдено на <a href="https://stackoverflow.com/a/7055259/496209">https://stackoverflow.com/a/7055259/496209</a> </p>

<pre><code>order by coalesce(date-time-field,large date in future) </code></pre>

<p>вы можете использовать встроенную функцию для проверки на ноль или не ноль, как показано ниже. я проверяю его, и он работает нормально.</p><p><code>select mydate from mytable order by isnull(mydate,1) desc, mydate asc;</code></p>

<p>если ваш движок позволяет использовать <code>order by x is null, x</code> или <code>order by x nulls last</code>. но если это не так, это может помочь:</p><p>если вы сортируете по числовому типу, вы можете сделать это: (заимствование схемы из <a href="https://stackoverflow.com/a/25564985/213246">другой ответ</a> .)</p><pre><code>select * from employees order by isnull(departmentid*0,1), departmentid; </code></pre><p> <a href="https://i.stack.imgur.com/spkkm.png"><img src="https://i.stack.imgur.com/spkkm.png" alt="result showing sorted by departmentid with nulls last"></a> </p><p>любое ненулевое число становится 0, а нулями становится 1, что сортирует нулевые значения в последнюю очередь.</p><p>вы также можете сделать это для строк:</p><pre><code>select * from employees order by isnull(left(lastname,0),'a'), lastname </code></pre><p> <a href="https://i.stack.imgur.com/6i1so.png"><img src="https://i.stack.imgur.com/6i1so.png" alt="result showing sorted by lastname with nulls last"></a> </p><p>потому что <code>'a'</code>> <code>''</code>.</p><p>это даже работает с датами, приводя к обнуляемому int и используя метод для целых чисел выше:</p><pre><code>select * from employees order by isnull(convert(int, hiredate)*0, 1), hiredate </code></pre><p>(давайте представим, что схема имеет hiredate.)</p><p>эти методы позволяют избежать необходимости придумывать или управлять "максимальным" значением каждого типа или исправлять запросы, если тип данных (и максимальный) изменяется (обе проблемы, с которыми сталкиваются другие решения isnull). плюс они намного короче, чем дело.</p>

<p>когда ваш столбец заказа числовой (например, ранг), вы можете умножить его на -1, а затем заказать по убыванию. это сохранит порядок, который вы ожидаете, но поставьте null последним.</p><pre><code>select * from table order by -rank desc </code></pre>

<pre><code>select * from employees order by isnull(departmentid, 99999); </code></pre><p>смотрите <a href="http://nickstips.wordpress.com/2010/09/30/sql-order-by-with-null-values-last/">это сообщение в блоге</a> .</p><p><img src="https://nickstips.files.wordpress.com/2010/09/data\_correct1.png?w=780" alt=""></p>

<p>в oracle вы можете использовать <code>nulls first</code> или <code>nulls last</code>: указывает, что значения null должны возвращаться до/после значений, отличных от null:</p><pre><code>order by { column-name | [ asc | desc ] | [ nulls first | nulls last ] } </code></pre><p>например:</p><pre><code>order by date desc nulls last </code></pre><p>ссылка: <a href="http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html">http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html</a> </p>

<p>спасибо redfilter за предоставленное отличное решение проблемы с ошибками сортировки обнуляемого поля даты и времени.</p><p>я использую базу данных sql server для моего проекта.</p><p>изменение нулевого значения datetime на '1' решает проблему сортировки для столбца типа данных datetime. однако если у нас есть столбец с типом данных, отличным от datetime, он не может быть обработан.</p><p>чтобы обработать сортировку столбцов varchar, я попытался использовать 'zzzzzzz', так как знал, что столбец не имеет значений, начинающихся с 'z'. сработало как положено.</p><p>в тех же строках я использовал максимальные значения +1 для int и других типов данных, чтобы получить сортировку, как и ожидалось. это также дало мне результаты, которые были необходимы.</p><p>тем не менее, всегда было бы идеально получить что-то более простое в самом движке базы данных, которое могло бы сделать что-то вроде:</p><pre><code>order by col1 asc nulls last, col2 asc nulls first </code></pre><p>как упомянуто в ответе, предоставленном a\_horse\_with\_no\_name.</p>

<pre><code>order by -cast([nativedatemodify] as bigint) desc </code></pre>

<p>решение с использованием "case" является универсальным, но тогда не используйте индексы.</p><pre><code>order by case when mydate is null then 1 else 0 end, mydate </code></pre><p>в моем случае мне нужна производительность.</p><pre><code> select smonecol1,somecol2 from somesch.sometab where somecol2 = 2101 and ( somecol1 is null ) union select smonecol1,somecol2 from somesch.sometab where somecol2 = 2101 and ( somecol1 is not null) </code></pre>

<p>если вы используете mariadb, они упоминают следующее в <a href="https://mariadb.com/kb/en/library/null-values/#ordering">документация значений null</a> .</p><blockquote> <h2> <a href="https://mariadb.com/kb/en/library/null-values/#ordering">заказ</a> </h2> <p>когда вы упорядочиваете поле, которое может содержать значения null, любые значения null считаются самыми низкими. таким образом, при заказе в порядке desc null будут появляться последними. чтобы заставить null считаться самыми высокими значениями, можно добавить еще один столбец, который имеет более высокое значение, когда основное поле равно null. пример:</p> <pre><code>select col1 from tab order by isnull(col1), col1; </code></pre> <p>по убыванию, сначала с null:</p> <pre><code>select col1 from tab order by if(col1 is null, 0, 1), col1 desc; </code></pre> <p>все значения null также считаются эквивалентными для целей предложений distinct и group by.</p> </blockquote><p>выше показаны два способа упорядочения по значениям null, вы также можете комбинировать их с ключевыми словами asc и desc. например, другой способ сначала получить значения null:</p><pre><code>select col1 from tab order by isnull(col1) desc, col1; -- ^^^^ </code></pre>

<p>использовать функцию nvl</p><pre><code> select * from mytable order by nvl(mydate, to\_date('1-1-1','dd-mm-yyyy')) </code></pre><p>вот <a href="http://www.w3schools.com/sql/sql\_isnull.asp">альтернатива nvl в самой известной субд</a> </p>