我有个问题
我试图google,但看起来像他们不喜欢*@H_404_3@
我正在使用sql Server 2008.@H_404_3@
P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder ------------------------------------------------------------------------ 1 Jarlsberg 10.45 16 15 2 Mascarpone Null 23 NULL 3 Gorgonzola 15.67 9 20
如果我需要用字符串替换null我知道我做:@H_404_3@
SELECT ISNULL(UnitsOnOrder,'No Data') FROM tbl
问题@H_404_3@
>如何用多列名称使用ISNULL()?
>是否可以使用*@H_404_3@
喜欢@H_404_3@
SELECT ISNULL(*,'NO data') FROM tbl
我认为这将是棘手的,因为数据类型,你不能传递字符串到INT数据类型,所以我怎么可以修复这个@H_404_3@
更新@H_404_3@
好的,如果我使用的数据类型为int的ISNULL()将返回0
这对我来说是一个价值,我该如何传递空字符串呢?@H_404_3@
解决方法
您可以在不同列的同一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的查询.例如:@H_404_3@
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时,此代码有问题,但它说明了该技术.@H_404_3@
请注意,如果您有另一列应该返回值,如果值为null,则可以使用COALESCE表达式,如下所示:@H_404_3@
SELECT COALESCE(ProductName,P_Id) AS Product...