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

Как мы можем использовать ISNULL для всех имен столбцов в SQL Server 2008?

У меня есть вопрос

Я попытался google его, но похоже, что ему не нравится *

Я использую SQL Server 2008.

У меня есть следующая таблица базы данных:

 P_Id   ProductName UnitPrice   UnitsInStock    UnitsOnOrder
------------------------------------------------------------------------
   1    Jarlsberg   10.45                 16    15
   2    Mascarpone  Null                  23    NULL 
   3    Gorgonzola  15.67                  9    20

Если мне нужно заменить null на строку, которую я знаю, я делаю:

 SELECT ISNULL(UnitsOnOrder,'No Data') FROM tbl

Вопросы

  • Как использовать ISNULL() с именами нескольких столбцов?
  • Можно ли использовать его с *

Как

SELECT ISNULL(* , 'NO data') FROM tbl 

Я думаю, что это будет сложно из-за типа данных, вы не можете передать строку в тип данных INT, так как я могу исправить это тоже

Обновить

Хорошо, если я использую ISNULL() с типом данных INT, он вернет 0 который будет для меня ценным, как я могу передать пустую строку вместо этого?

4b9b3361

Ответ 1

Вы можете использовать ISNULL несколько раз в одном выражении SQL для разных столбцов, но вы должны написать его отдельно для каждого столбца:

SELECT
    ISNULL(ProductName, 'No Data') AS ProductName,
    ISNULL(CAST(UnitPrice AS NVARCHAR), 'No Data') AS UnitPrice, 
    ISNULL(CAST(UnitsInStock AS NVARCHAR), 'No Data') AS UnitsInStock,
    ISNULL(CAST(UnitsOnOrder AS NVARCHAR), 'No Data') AS UnitsOnOrder
FROM tbl

Если вы создаете динамический SQL-запрос, теоретически можете собрать список столбцов в таблице и сгенерировать запрос с ISNULL для каждого из них. Например:

DECLARE @SQL nvarchar(max)

SET @SQL = 'SELECT '

SELECT @SQL = @SQL + 'ISNULL(CAST([' + sc.name + '] AS NVARCHAR), ''No Data'') AS [' + sc.name + '],'
FROM sys.objects so
INNER JOIN sys.columns sc ON sc.object_id = so.object_id
WHERE so.name = 'tbl'

-- Remove the trailing comma
SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 1) + ' FROM tbl'

EXEC sp_sqlexec @SQL

Этот код имеет проблемы при преобразовании некоторых типов столбцов, таких как метки времени, в nvarchar, но он иллюстрирует технику.

Обратите внимание, что если бы у вас был другой столбец, который должен быть возвращен, если значение равно null, вы можете использовать выражение COALESCE следующим образом:

SELECT COALESCE(ProductName, P_Id) AS Product...

Ответ 2

Попробуй это...

ISNULL (COALESCE (column1, column2), 'No Data')

Вам нужно будет включить все имена столбцов, вы не можете использовать *

COALESCE возвращает первое ненулевое значение в своем списке аргументов, поэтому, если все они равны NULL, он возвращает нуль