Подтвердить что ты не робот

Конкатенация строк SQL Server с помощью Null

Я создаю вычисляемый столбец в полях, некоторые из которых потенциально нулевые.

Проблема в том, что если любое из этих полей равно null, весь вычисленный столбец будет равен нулю. Я понимаю из документации Microsoft, что это ожидается и может быть отключен с помощью параметра SET CONCAT_NULL_YIELDS_NULL. Однако я не хочу изменять это поведение по умолчанию, потому что я не знаю его последствий для других частей SQL Server.

Есть ли способ проверить, является ли столбец нулевым и только добавить его содержимое в формулу с вычисленным столбцом, если его значение не равно null?

4b9b3361

Ответ 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 избавляется от любых пробелов на концах.