объединение результатов SQL-запроса и столбцов NULL
Мне нужно объединить несколько столбцов таблицы в одно значение, а затем показать это значение в выпадающем списке asp. SQL-код, который я выдаю, выглядит следующим образом:
Выберите UserID, CustomerNum, UserName + ' - ' + UserAddress +', '+ UserCity + '' + UserState в качестве UserInfo
От пользователей
Где (CustomerNum = @CustomerNum)
Заказ по имени пользователя
Затем я устанавливаю 'UserInfo' в качестве текстового поля в раскрывающемся списке.
Это обычно работает, за исключением иногда одного из столбцы в базе данных имеют значение null (например, UserState). Когда это происходит, вся конкатенация равна нулю, и я получаю пустую запись в раскрывающемся списке.
Есть ли что-то в SQLServer, что позволит мне игнорировать эти нулевые результаты, или мне придется что-то кодировать в событии DataBind?
Спасибо
6 ответов:
Оберните вокруг него коалесцирующую пленку
COALESCE(UserName,'') + ' - ' + COALESCE(UserAddress,'') + ',' + COALESCE(UserCity,'') + ' ' + COALESCE(UserState,'') AS UserInfo
Для SQL Server у вас есть три варианта:
- IsNull - это самый старый и наиболее совместимый метод, хотя он не существует в SQL Server Compact Edition (не знаю, актуально ли это). Он принимает два аргумента и возвращает первый из двух, который не является нулевым, или null, если оба являются.
- Coalesce - это новее и предпочтительнее для нового развития. Аналогично
IsNull, но может принимать более двух аргументов. Как иIsNull, он вернет первое ненулевое значение аргумент, или null, если все есть.- CONCAT_NULL_YIELDS_NULL - это параметр базы данных, который может быть установлен в
ONилиOFF. Значение должно быть само-объяснительным, но вот ссылкаMSDN .
Используйте нулевую конкатенацию в своих интересах, это удалит ненужные символы-разделители:
SELECT UserID, CustomerNum ,ISNULL(UserName+' - ','') +ISNULL(UserAddress+', ','') +ISNULL(UserCity+' ','') +ISNULL(UserState,'') AS UserInfo FROM Users WHERE CustomerNum = @CustomerNum ORDER BY UserNameРабочий пример:
DECLARE @Users table (userID int, CustomerNum int,UserName varchar(20), UserAddress varchar(20), UserCity varchar(20), UserState varchar(20)) INSERT @Users VALUES (1,111,'Sam','123 First St.', 'city name', 'state name') INSERT @Users VALUES (2,111,null,'123 First St.', 'city name', 'state name') INSERT @Users VALUES (3,111,'Sam',null, 'city name', 'state name') INSERT @Users VALUES (4,111,'Sam','123 First St.', null, 'state name') INSERT @Users VALUES (5,111,'Sam','123 First St.', 'city name', null) INSERT @Users VALUES (6,111,null,null, 'city name', 'state name') SELECT UserID, CustomerNum ,ISNULL(UserName+' - ','') +ISNULL(UserAddress+', ','') +ISNULL(UserCity+' ','') +ISNULL(UserState,'') AS UserInfo FROM @Users --WHERE CustomerNum = @CustomerNum ORDER BY userIDВывод:
UserID CustomerNum UserInfo ----------- ----------- ------------------------------------------- 1 111 Sam - 123 First St., city name state name 2 111 123 First St., city name state name 3 111 Sam - city name state name 4 111 Sam - 123 First St., state name 5 111 Sam - 123 First St., city name 6 111 city name state name (6 row(s) affected)
Вы можете сделать это:
SELECT UserID, CustomerNum, UserName + ' - ' + ISNULL(UserAddress + ',','') + ISNULL(UserCity,'') + ' ' + ISNULL(UserState,'') AS UserInfo FROM Users WHERE (CustomerNum = @CustomerNum) ORDER BY UserName
Если вы хотите игнорировать нулевые результаты (исключить их), вы можете добавить то, что я имею ниже, к вашему
WHERE.ISNULLилиCOALESCEможно использовать для выбора пустых строк для пустых столбцов, как описано выше, если это то, что вам нужно сделать.... WHERE UserName is not null AND UserAddress is not null AND UserCity is not null AND UserState is not null
Comments