TSQL - ISNULL для нескольких столбцов - PullRequest
5 голосов
/ 07 июня 2011

У меня есть простой запрос SQL (SQL Server 2005), где я выбираю из таблицы, содержащей несколько столбцов, которые имеют значения BIT.Эти столбцы могут иметь значение NULL, поэтому могут содержать NULL, 0 или 1.

. Имеется достаточное количество этих столбцов, и в моем запросе я хочу вернуть ноль, если значение равно NULL.В настоящее время я использую ISNULL следующим образом:

SELECT Name, Age, ISNULL(LikesOranges,0), ISNULL(LikesApples,0), ISNULL(LikesPears,0)
FROM FoodPreferences

Как я уже упоминал, таких столбцов BIT много (гораздо больше, чем в простом примере выше).Есть ли способ, которым я могу использовать ISNULL для нескольких столбцов, например:

SELECT ISNULL(*,0) FROM FoodPreferences

Приведенный выше запрос не работает, но вы получаете то, что я пытаюсь сделать, поэтому я могу избежать написания ISNULLзаявление для каждого столбца,

Спасибо.

Ответы [ 5 ]

7 голосов
/ 07 июня 2011

, поэтому я могу избежать записи оператора ISNULL для каждого столбца,

Запустите этот запрос и скопируйте результат в оператор выбора.system_type_id = 104 фильтрует результат по bit столбцам.

select stuff((select  ', isnull('+name+', 0)'
              from sys.columns
              where object_id = object_id('FoodPreferences') and 
                    system_type_id = 104
              for xml path('')), 1, 1, '')

Результат:

-------------------------------------------------------------------------
 isnull(LikesOranges, 0), isnull(LikesApples, 0), isnull(LikesPears, 0)
7 голосов
/ 07 июня 2011

Попробуйте это:

SELECT COALESCE(LikesOranges, LikesApples, LikesPears) AS MyBit FROM FoodPreferences

Это вернет первое ненулевое значение. Если все поля равны NULL, результат равен NULL.


UPDATE:

И вывод такой:

SELECT ISNULL(COALESCE(LikesOranges, LikesApples, LikesPears),0) AS MyBit FROM FoodPreferences
3 голосов
/ 07 июня 2011

Я так не думаю.Но вариант может состоять в том, чтобы создать представление для этой таблицы и поместить все операторы ISNULL в представление.По крайней мере, тогда вам не придется делать это каждый раз

например.

CREATE VIEW vwFoodPreferences
AS
SELECT Name, 
       Age, 
       ISNULL(LikesOranges,0) AS LikesOranges, 
       ISNULL(LikesApples,0) AS LikesApples, 
       ISNULL(LikesPears,0) AS LikesPears
FROM   FoodPreferences
2 голосов
/ 07 июня 2011

К сожалению, простой ответ - no.

Вы могли бы написать sql динамически, но что бы ни случилось, окончательный результат sql должен был бы быть ISNULL(a,0), ISNULL(b,0), ISNULL(c,0), ISNULL(d,0), etc

1 голос
/ 07 июня 2011

я думаю, что вы можете написать простую программу и сгенерировать предложение select, прочитав все столбцы и сгенерировав select

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...