Я нашел этот вопрос для интервью отсюда. Учитывая это содержимое таблицы Customers:
|---------------------|------------------|------------------|
| Id | Name | ReferredBy |
|---------------------|------------------|------------------|
| 1 | John Doe | NULL |
|---------------------|------------------|------------------|
| 2 | Jane Smith | NULL |
|---------------------|------------------|------------------|
| 3 | Anne Jenkins | 2 |
|---------------------|------------------|------------------|
| 4 | Eric Branford | NULL |
|---------------------|------------------|------------------|
| 5 | Pat Richards | 1 |
|---------------------|------------------|------------------|
| 6 | Alice Barnes | 2 |
|---------------------|------------------|------------------|
Вот запрос, написанный для возврата списка клиентов, не упомянутых Джейн Смит:
SELECT Name FROM Customers WHERE ReferredBy <> 2;
Каким будет результат запроса? Зачем? Что было бы лучшим способом написать его? Ответ, упомянутый на веб-сайте:
SELECT Name FROM Customers WHERE ISNULL(ReferredBy, 0) <> 2;
Мой вопрос заключается в том, как мы можем написать тот же запрос с помощью COALESCE()
, потому что, как упоминалось здесь, COALESCE()
возвращает только первое non-null
значение.
В данном случае вы можете просто заменить isnull()
на coalesce()
, заменив имена функций.
isnull(referredby, 0)
возвращает 0
, если referredby
равно нулю еще referredby
. Так же coalesce(referredby, 0)
, как если referredby
имеет нулевое значение, 0
является первым не нулевое выражение, и если referredby
не является нулевым referredby
, что первое не нулевое выражение и возвращается.
На самом деле единственная разница между isnull()
и coalesce()
заключается в том, что isnull()
может принимать только два выражения, где coalesce()
принимает два или более. Используя isnull()
вам нужно будет isnull()
вызовы, если у вас было более двух выражений.
coalesce()
возвращает толькоnon-null
значения, в этом случае имеет ли смыслcoalesce(referredby, 0)
? Coz в соответствии с примером, показанным тамSELECT COALESCE(NULL, NULL, 'third_value', 'fourth_value');
возвращает толькоthird_value
же самое будет в случае сcoalesce(referredby, 0)
third_value
coalesce(referredby, 0)
верно? т.е. показываетnon-null
значенияreferredby
, делает ввод0
сделать его функционировать какISNULL
, если да , пожалуйста , вы можете подробно объяснить , каким образом ?