我有一个问题
我尝试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
这对我来说是一个价值,我怎么能传递空字符串呢?
答案 0 :(得分:16)
对于不同的列,您可以在同一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...
答案 1 :(得分:2)
试试这个......
ISNULL(COALESCE(第1栏,第2栏),'无数据')
您需要包含所有列名称,但不能使用*
COALESCE在其参数列表中返回第一个非null值,因此如果它们都为null,则返回null