12

我有个问题

我试过了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 对我来说将是一个值,我怎样才能传递空字符串呢?

4

2 回答 2

17

您可以在同一 SQL 语句中对不同的列多次使用 ISNULL,但必须为每列单独编写:

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...
于 2012-11-05T18:06:52.950 回答
2

试试这个...

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

您需要包含所有列名,但不能使用 *

COALESCE 返回其参数列表中的第一个非空值,因此如果它们都为空,它将返回空

于 2012-11-05T18:42:13.603 回答