объединение результатов SQL-запроса и столбцов NULL



Мне нужно объединить несколько столбцов таблицы в одно значение, а затем показать это значение в выпадающем списке asp. SQL-код, который я выдаю, выглядит следующим образом:



Выберите UserID, CustomerNum, UserName + ' - ' + UserAddress +', '+ UserCity + '' + UserState в качестве UserInfo
От пользователей
Где (CustomerNum = @CustomerNum)
Заказ по имени пользователя



Затем я устанавливаю 'UserInfo' в качестве текстового поля в раскрывающемся списке.



Это обычно работает, за исключением иногда одного из столбцы в базе данных имеют значение null (например, UserState). Когда это происходит, вся конкатенация равна нулю, и я получаю пустую запись в раскрывающемся списке.



Есть ли что-то в SQLServer, что позволит мне игнорировать эти нулевые результаты, или мне придется что-то кодировать в событии DataBind?



Спасибо

1150   6  

6 ответов:

Для столбцов nullable сделайте что-то вроде этого.

ISNULL(UserState, '')

Оберните вокруг него коалесцирующую пленку

COALESCE(UserName,'') + ' - ' + 
COALESCE(UserAddress,'') + ',' + 
COALESCE(UserCity,'') + ' ' + 
COALESCE(UserState,'') AS UserInfo

Для SQL Server у вас есть три варианта:

  1. IsNull - это самый старый и наиболее совместимый метод, хотя он не существует в SQL Server Compact Edition (не знаю, актуально ли это). Он принимает два аргумента и возвращает первый из двух, который не является нулевым, или null, если оба являются.
  2. Coalesce - это новее и предпочтительнее для нового развития. Аналогично IsNull, но может принимать более двух аргументов. Как и IsNull, он вернет первое ненулевое значение аргумент, или null, если все есть.
  3. 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

    Ничего не найдено.