Поиск первого значения, отличного от 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.