Размещение значений NULL при сортировке столбцов

Оригинал

Если столбцы могут хранить NULL, то при сортировке используется определенный порядок размещения таких значений. В этом вопросе подход вендоров баз данных может как совпадать так и отличаться, в зависимости от цели приложения.

Использование

MySQL

PostgreSQL

Подробное объяснение 

NULL в SQL указывает на некое неизвестное значение, то есть просто не известно, что в столбце. Эти отсутствующие значения являются проблемой при сравнении их с другим значением и при сортировке строк в таблице. С математической точки зрения несуществующее значение нельзя сравнивать с чем-либо, например с каким-нибудь числом. Поэтому математически верная сортировка невозможна. Так как стандарт SQL не содержит указания как значения NULL должны обрабатываться при сортировке,  то каждая база данных была вынуждена изобретать свое собственное соглашение. В MySQL любое значение NULL будет помещено перед всеми другими значениями при выполнении сортировки по возрастанию, но в тоже время в PostgreSQL эти же значения будут размещены в конце. Оба подхода являются разными решениями для установления детерминированной сортировки, которую база данных может использовать.

Тем не менее, эти специфичные для конкретных баз данных порядки сортировки могут не соответствовать требованиям приложения. Для удобства использования можно размещать пустые значения в начале или в конце. Пользователь, сортирующий список имен по возрастанию или по убыванию, не захочет видеть пустые значения первыми когда ищет конкретную запись. Но в тоже время к отображению списка статей блога в админке будут предъявляться другие требования. Неопубликованные статьи должны быть выведены перед всеми опубликованными при сортировке по убыванию, чтобы увидеть их первыми.

Размещение значений NULL должно меняться в зависимости от контекста приложения, потому что сортировка по умолчанию базы данных не всегда будет полезна. Простое правило для проверки места расположения NULL:

  • размещайте NULL в конце когда пользователь может искать конкретные записи.
  • размещайте NULL в начале когда эти записи имеют конкретный смысл и поэтому должны предшествовать всем остальным.

Дополнительные ресурсы

Merge 2022

Представители нашей компании посетили конференцию Merge, которая проходила в Иннополисе 20 и 21 мая. Мероприятие было довольно интересным и нам хотелось бы поделиться впечатлениями о нём.

Читать →

Null safety в Dart — подробный разбор

Подробно разбираемся с Null Safety в языке Dart.

Из этого видео вы узнаете:

  • Проблема: зачем нужен null safety.
  • Что такое sound null safety?
  • Как меняется система типов в Dart c введением null safety.
  • Что добавилось в синтаксисе и какие новые ключевые слова появились в языке
  • Как выполнить миграцию вашего проекта или пакета на null safety.

Разбираемся с декораторами в JavaScript

Концепцию декораторов можно рассматривать с разных сторон. Это и шаблон проектирования описанный в известной книге GOF и подход применяемый в функциональном программировании для построения композиции функций. Как правило, когда говорят о декораторах в контексте ECMA Script, то под этим подразумевают функции, которые могут применяться к другим функциям или объектам для изменения или расширения их поведения. Иначе говоря, эти функции декорируют (оборачивают) другие функции или объекты.

Читать →

Flutter 2. Что нового

3 марта 2021 в рамках мероприятия Flutter Engage была представлена новая версия фреймворка — Flutter 2. И это действительно мажорный апдейт! Вместе с новой версией Flutter вышла и новая версия Dart 2.12, которая принесла весьма ожидаемый null safety (ура!). Это настолько крутая фича, что язык тоже заслуживал бы мажорной версии, но разработчики специально не стали этого делать, т.к. новая версия не нарушает обратной совместимости (!).

Для того, чтобы рассказать что нового во Flutter 2 и Dart 2.12, я записал видео. Приятного просмотра!

Читать →

Функциональное программирование ч. 1

В последнее время мы все чаще и чаще слышим о функциональном программировании. Все новые языки так или иначе добавляют элементы «функциональщины», а ООП все чаще ругают, приводя как альтернативу в том числе и функциональный подход. Но что же такое функциональное программирование?

Сегодня мы подробно рассказываем о том, что такое функциональное программирование, какие есть языки функционального программирования и чем функциональное программирование отличается от императивного.

Это первая часть большого доклада, во второй части речь пойдет о языке F# и функциональном программировании в F#.

 

Двоичный поиск

Задавлись ли вы вопросом, в очередной раз используя поиск файлов в ОС, за которой работаете, почему он выполняется так медленно? Нет, даже тааааааак медленно? Читать →

(Вредные) советы для разработки на Flutter

Недавно я наткнулся на статью Tips for Coding with Flutter. И не просто где-то в самом темном закоулке Интернета, а прямо Medium мне прислал ее в подборке, в качестве рекомендации. Т.е. статья весьма популярна и её прочитает много разработчиков, в том числе и начинающих.

Я начал читать и то, что я увидел — мне совсем не понравилось. Некоторые советы действительно хорошие, но некоторые — весьма спорные. Давайте пойдем по порядку.

Именование

Naming Convention

Libraries, packages, directories, and source files should be in lowercase with underscores in between words like this:

library dart_dynamic_links;
import 'socket/socket_manager.art';

Classes, enums, extension names, and typedefs should start in uppercase like this :

class MainSection {...}
enum ItemSelectionTemp {...}
extension MyList<F> on List<F> {...}
typedef Definition<D> = bool function(D value);

Constants, variables, parameters, and named parameters should start with lowercase then the other words start with uppercase just like this example:

const magazinePrice = 4.20;
var itemsOfSchools;
final urlPlacement = RegExp(‘^([a-z]+):');
void magSum(int magazinePrice) {...}

Здесь лучше всего просто придерживаться официальных рекомендаций 

https://dart.dev/guides/language/effective-dart/style 

https://dart.dev/guides/language/effective-dart/design#names

Там описание более полное, с корректными примерами и пояснениями. В отличие от того, что мы видим в статье.

Следующий совет: «Указывайте тип для членов класса»

Specify Types for Classes Members

It’s important that you always specify the type of member when the values are known. You should avoid using var when possible.

int days = 22;
final vehichle car = vehichle();
String name = 'Kevin';
const int timeUntilEnd = 120;

С приведенными примерами указание типа не имеет смыла, об этом и говорится в Effective Dart. Тип нужно указывать когда он не очевиден, а что хорошего в дублировании одного и того же слова в строчке final Vehichle car = Vehichle();  – решительно не понятно.

Читать →