Функция COALESCE в TSQL

Может ли кто-нибудь объяснить, как работает функция COALESCE в TSQL? Синтаксис выглядит следующим образом

COALESCE (x, y)

Документ MSDN по этой функции довольно расплывчатый

Ответ 1

Мне сказали, что COALESCE дешевле, чем ISNULL, но исследования не указывают на это. ISNULL принимает только два параметра, поле оценивается для NULL, и результат, который вы хотите, если он оценивается как NULL. COALESCE примет любое количество параметров и вернет первое найденное значение, которое не является NULL.

Там более подробное описание деталей здесь http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

Ответ 2

Я не уверен, почему вы считаете, что документация расплывчата.

Он просто просматривает все параметры один за другим и возвращает первое, что есть NOT NULL.

COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1


COALESCE(1, 2, 3, 4, 5, NULL)
=> 1


COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3


COALESCE(6, 5, 4, 3, 2, NULL)
=> 6


COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL

Он принимает практически любое количество параметров, но они должны быть одного и того же типа данных. (Если они не являются одним и тем же типом данных, они неявно переводятся в соответствующий тип данных, используя порядок приоритетов типа данных).

Это похоже на ISNULL(), но для нескольких параметров, а не только для двух.

Он также ANSI-SQL, где-as ISNULL() не является.

Ответ 3

Вот как я смотрю на COALESCE... и, надеюсь, это имеет смысл...

В упрощенной форме....

Coalesce (FieldName, 'Empty')

Итак, это означает, что... Если "FieldName" имеет значение NULL, заполните значение поля словом "EMPTY".

Теперь для значений mutliple...

Coalesce (FieldName1, FieldName2, Value2, Value3)

Если значение в Fieldname1 равно null, заполните его значением в поле Namename2, если поле FieldName2 равно NULL, заполните его Value2 и т.д.

Этот фрагмент тестового кода для базы данных примеров AdventureWorks2012 отлично работает и дает хорошее визуальное объяснение того, как работает COALESCE:

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product

Ответ 4

Есть намного больше, чтобы объединиться, чем просто замена ISNULL. Я полностью согласен с тем, что официальная "документация" коалесценции является расплывчатой ​​и бесполезной. Эта статья очень помогает. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

Ответ 5

Если мы передаем строки FirstName, MiddleName и LastName в качестве параметров функции COALESCE(). Функция COALESCE() возвращает первое ненулевое значение из трех столбцов. Обратите внимание, что это происходит для каждой строки в таблице.

SELECT Id, COALESCE(FirstName, MiddleName, LastName) AS Name
FROM tblEmployee

Ответ 6

Вот простой запрос, содержащий coalesce -

select * from person where coalesce(addressId, ContactId) is null.

Он вернет лица, в которых оба параметра addressId и contactId равны null.

функция коалесценции

  • принимает минимум два аргумента. Аргументы
  • должны быть целочисленного типа.
  • возвращает первый непустой аргумент.

например.

  • coalesce (null, 1, 2, 3) вернет 1.
  • coalesce (null, null) будет return null.

Ответ 7

Простейшее определение функции Coalesce() может быть следующим:

Функция Coalesce() оценивает все переданные аргументы, а затем возвращает значение первого экземпляра аргумента, который не оценивается как NULL.

Примечание: он оценивает ВСЕ параметры, то есть не пропускает оценку аргумента (ов) справа от возвращенного параметра /NOT NULL.

Синтаксис:

Coalesce(arg1, arg2, argN...)

Остерегайтесь: Помимо аргументов, которые оцениваются как NULL, все остальные (NOT-NULL) аргументы должны быть либо с одинаковым типом данных, либо с типами соответствия (которые могут быть "неявно автоматически преобразованы" в совместимый тип данных), см. примеры ниже:

PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.

DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today date, works fine as implicit conversion into DATE type occurs.

--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.

НТН

Ответ 8

declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str