如何在T-SQL中替换一个字符串,如果记录为NULL

10

我正在编写一个T-SQL报告,显示了不同客户的不同状态下账户数量。该报告的结果如下:

Customer1    NoService        7
Customer1    IncompleteOrder  13
Customer1    NULL             9
Customer2    NoService        12
Customer2    Available        19
Customer2    NULL             3
...

'NULL'状态是有效数据,但我想要显示"Pending"而不是NULL。以下是我目前的SQL:

USE cdwCSP;
SELECT
   sr.sales_region_name   AS SalesRegion
   , micv.value
   , COUNT(sr.sales_region_name)
FROM prospect p
   LEFT JOIN sales_region sr
     ON p.salesRegionId = sr.sales_region_number
   LEFT JOIN prospectOrder po
     ON po.prospectId = p.prospectId
   LEFT JOIN wo
     ON wo.prospectId = p.prospectId
   LEFT JOIN woTray wot
     ON wot.woId = wo.woId
   LEFT JOIN miscInformationCustomerCategory micc
     ON micc.prospectId = p.prospectId
   LEFT JOIN miscInformationCustomerValues micv
     ON micv.miscInformationCustomerCategoryId = micc.miscInformationCustomerCategoryId
   LEFT JOIN miscInformationCategory mic
     ON micc.miscInformationCategoryId = mic.miscInformationCategoryId
WHERE wot.dateOut IS NULL
     AND mic.categoryName LIKE '%Serviceability%'
GROUP BY sr.sales_region_name, micv.value
ORDER BY sr.sales_region_name, micv.value;

希望能得到任何帮助,我还在学习T-SQL,所以这可能是一个容易回答的问题。

3个回答

23
您可以使用 COALESCEISNULL。前者是标准的,返回第一个非空参数(如果所有参数都为NULL则返回NULL)。
SELECT COALESCE(micv.value,'Pending') as value

ISNULL 只限于2个参数,但如果要测试的第一个值很难评估(例如子查询),则在SQL Server中更有效。

使用 ISNULL 需要注意的一个潜在问题是它返回第一个参数的数据类型,因此,如果要替换的字符串长度超过列数据类型允许的长度,则需要进行转换。

例如:

CREATE TABLE T(C VARCHAR(3) NULL);

INSERT T VALUES (NULL);

SELECT ISNULL(C,'Unknown')
FROM T

将返回未知

但是ISNULL(CAST(C as VARCHAR(7)),'未知')COALESCE都可以达到预期效果。


非常完美,这个运行良好且看起来很高效。感谢您的帮助。 - dvanaria

1
SELECT
   sr.sales_region_name   AS SalesRegion
   , ISNULL(micv.value,'Pending')
   , COUNT(sr.sales_region_name)
FROM prospect p
--(...)

请前往ISNULL获取更多信息。


1

你也可以使用 ISNULL('value', 'replacewithvalue')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接