Поиск первого значения, отличного от NULL

Я давно хотел написать о SQL больше, и поэтому решил каждую неделю рассматривать новую функцию SQL.

Если вы хотите продолжить, я использую примерную базу данных chinnook с SQLite. Однако обратите внимание, что я, возможно, изменил базу данных, чтобы лучше продемонстрировать что-то.

Сегодня мы рассмотрим COALESCE(), очень полезную функцию, которая возвращает первое значение, отличное от NULL, в переданных ей аргументах.

Вот простой пример:

SELECT COALESCE(1,2,3)

1 — это первое значение, отличное от NULL, так что это то, что возвращается при выполнении этого запроса.

Более практичным примером может быть передача столбцов в функцию.

Допустим, у меня есть таблица со списком сведений о моих клиентах, включая номера их факсов и телефонов (представим, что сейчас 1999 год).

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

Я могу использовать COALESCE() для возврата адреса электронной почты, если у клиента нет номера факса:

SELECT FirstName || " " ||LastName, COALESCE(Fax, Email) as contact_method
FROM Customer

Набор результатов:

customer_name        |contact_method             |
---------------------+---------------------------+
Luís Gonçalves       |+55 (12) 3923-5566         |
Leonie Köhler        |[email protected]      |
François Tremblay    |[email protected]        |
Bjørn Hansen         |[email protected]      |
František Wichterlová|+420 2 4172 5555           |
Helena Holý          |[email protected]            |
Astrid Gruber        |[email protected]     |
Daan Peeters         |[email protected]      |
Kara Nielsen         |[email protected]      |
Eduardo Martins      |+55 (11) 3033-4564         |
Alexandre Rocha      |+55 (11) 3055-8131         |
Roberto Almeida      |+55 (21) 2271-7070         |
Fernanda Ramos       |+55 (61) 3363-7855         |

Если ни один из столбцов в COALESCE() не возвращает значение, отличное от NULL, возвращается NULL.

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

Передав три столбца в качестве аргументов, COALESCE() сначала будет искать значение, отличное от NULL, в факсе, затем в электронной почте, а затем в телефоне:

SELECT FirstName || " " ||LastName, COALESCE(Fax, Email, Phone) as contact_method
FROM Customer

Вот и все!

Если вам понравилась эта статья, подпишитесь на меня в Medium и Twitter. Помимо того, что я пишу о SQL, я также пишу о Python, публикуя учебные пособия для забавных проектов, таких как создание списка лучших книг научной фантастики с использованием Python.