Конкатенация строк SQL Server с помощью Null
Я создаю вычисляемый столбец в полях, некоторые из которых потенциально нулевые.
Проблема в том, что если любое из этих полей равно null, весь вычисленный столбец будет равен нулю. Я понимаю из документации Microsoft, что это ожидается и может быть отключен с помощью параметра SET CONCAT_NULL_YIELDS_NULL. Однако я не хочу изменять это поведение по умолчанию, потому что я не знаю его последствий для других частей SQL Server.
Есть ли способ проверить, является ли столбец нулевым и только добавить его содержимое в формулу с вычисленным столбцом, если его значение не равно null?
Ответы
Ответ 1
Вы можете использовать ISNULL(....)
SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
Если значение столбца/выражения действительно равно NULL, тогда вместо этого будет использовано второе значение (здесь: пустая строка).
Ответ 2
От SQL Server 2012 это намного проще с помощью функции CONCAT
.
Он обрабатывает NULL
как пустую строку
DECLARE @Column1 VARCHAR(50) = 'Foo',
@Column2 VARCHAR(50) = NULL,
@Column3 VARCHAR(50) = 'Bar';
SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/
Ответ 3
Используйте COALESCE. Вместо your_column
используйте COALESCE(your_column, '')
. Это вернет пустую строку вместо NULL.
Ответ 4
Используйте
SET CONCAT_NULL_YIELDS_NULL OFF
и конкатенация нулевых значений в строку не приведет к null.
Обратите внимание, что это устаревший вариант, не используйте.
Дополнительную информацию см. В документации.
Ответ 5
Вы также можете использовать CASE - мой код ниже проверит как для нулевых значений, так и для пустых строк и добавляет сепаратор только в том случае, если есть следующее значение:
SELECT OrganisationName,
'Address' =
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END +
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END +
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END +
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END
FROM Organisations
Ответ 6
ISNULL(ColumnName, '')
Ответ 7
Я просто хотел внести свой вклад, если кто-то будет искать помощь с добавлением разделителей между строками, в зависимости от того, является ли поле NULL или нет.
Итак, в примере создания адреса одной строки из отдельных полей
Адрес1, Адрес2, Адрес3, Город, Почтовый индекс
в моем случае у меня есть следующий расчетный столбец, который, похоже, работает так, как я его хочу:
case
when [Address1] IS NOT NULL
then ((( [Address1] +
isnull(', '+[Address2],'')) +
isnull(', '+[Address3],'')) +
isnull(', '+[City] ,'')) +
isnull(', '+[PostCode],'')
end
Надеюсь, что это поможет кому-то!
Ответ 8
На сервере Sql:
insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]')
PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.
Код за:
string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;
insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')
Ответ 9
У меня тоже были проблемы с этим. Не удалось заставить его работать с примерами выше, но это делает для меня работу:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') +
' ' + ISNULL(House_no, '') +
' ' + ISNULL(Street, '') +
' ' + ISNULL(Town, '') +
' ' + ISNULL(City, ''))),' ',' ')
Заменить исправляет двойные пробелы, вызванные объединением одиночных пробелов между ними. r/ltrim избавляется от любых пробелов на концах.