Может ли кто-нибудь объяснить, как работает функция COALESCE в TSQL? Синтаксис выглядит следующим образом
COALESCE (x, y)
Документ MSDN по этой функции довольно расплывчатый
Может ли кто-нибудь объяснить, как работает функция COALESCE в TSQL? Синтаксис выглядит следующим образом
COALESCE (x, y)
Документ MSDN по этой функции довольно расплывчатый
Мне сказали, что COALESCE дешевле, чем ISNULL, но исследования не указывают на это. ISNULL принимает только два параметра, поле оценивается для NULL, и результат, который вы хотите, если он оценивается как NULL. COALESCE примет любое количество параметров и вернет первое найденное значение, которое не является NULL.
Там более подробное описание деталей здесь http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
Я не уверен, почему вы считаете, что документация расплывчата.
Он просто просматривает все параметры один за другим и возвращает первое, что есть 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()
не является.
Вот как я смотрю на 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
Есть намного больше, чтобы объединиться, чем просто замена ISNULL. Я полностью согласен с тем, что официальная "документация" коалесценции является расплывчатой и бесполезной. Эта статья очень помогает. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Если мы передаем строки FirstName, MiddleName и LastName в качестве параметров функции COALESCE(). Функция COALESCE() возвращает первое ненулевое значение из трех столбцов. Обратите внимание, что это происходит для каждой строки в таблице.
SELECT Id, COALESCE(FirstName, MiddleName, LastName) AS Name
FROM tblEmployee
Вот простой запрос, содержащий coalesce -
select * from person where coalesce(addressId, ContactId) is null.
Он вернет лица, в которых оба параметра addressId и contactId равны null.
функция коалесценции
например.
Простейшее определение функции 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.
НТН
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